Я пытаюсь извлечь число перед - и остальную часть строки после него, но не удается извлечь оба. Вот вывод из интерактивного терминала:

>>> a = '#232 - Hello There'
>>> re.findall('#(.*?) - (.*?)', a)
[('232', '')]

Почему мое регулярное выражение не работает должным образом?

2
smaili 30 Июн 2019 в 19:11

3 ответа

Лучший ответ

.*? является нежадным , т.е. он будет соответствовать наименьшей подстроке, вам нужна версия жадная , т.е. .* (соответствует самой длинной подстроке) для последней один:

In [1143]: a = '#232 - Hello There'                                                                                                                                                                         

In [1144]: re.findall('#(.*?) - (.*?)', a)                                                                                                                                                                  
Out[1144]: [('232', '')]

In [1145]: re.findall('#(.*?) - (.*)', a)                                                                                                                                                                   
Out[1145]: [('232', 'Hello There')]

Но вы должны использовать str методы для обработки таких простых случаев, например, используя str.split с разделением на -:

In [1146]: a.split(' - ')                                                                                                                                                                      
Out[1146]: ['#232', 'Hello There']

С str.partition на - и нарезкой:

In [1147]: a.partition(' - ')[::2]                                                                                                                                                                          
Out[1147]: ('#232', 'Hello There')
8
heemayl 30 Июн 2019 в 16:38

Это выражение может, вероятно, извлечь эти желаемые значения:

([0-9]+)\s*-\s*(.*)

демонстрация

Контрольная работа

import re

print(re.findall("([0-9]+)\s*-\s*(.*)", "#232 - Hello There"))

Выход

[('232', 'Hello There')]
0
Emma 30 Июн 2019 в 16:18

Ваше регулярное выражение в порядке, вы просто используете неправильную функцию из re. Следующее соответствует вещам правильно:

m = re.fullmatch('#(.*?) - (.*?)', a)
0
Eric 4 Июл 2019 в 19:46