Простое регулярное выражение Python не работает, как задумано - PullRequest
2 голосов
/ 30 июня 2019

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

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

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

Ответы [ 3 ]

8 голосов
/ 30 июня 2019

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

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')
0 голосов
/ 04 июля 2019

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

m = re.fullmatch('#(.*?) - (.*?)', a)
0 голосов
/ 30 июня 2019

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

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

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

Тест

import re

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

Вывод

[('232', 'Hello There')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...