re.findall() не такой жадный, как ожидалось — Python 2.7

Я пытаюсь получить список полных предложений из открытого текста, используя регулярное выражение в python 2.7. Для меня не важно, чтобы все, что может быть истолковано как полное предложение, было в списке, но все в списке должно быть полным предложением. Ниже приведен код, иллюстрирующий проблему:

import re
text = "Hello World! This is your captain speaking."
sentences = re.findall("[A-Z]\w+(\s+\w+[,;:-]?)*[.!?]", text)
print sentences

Согласно этому тестеру регулярных выражений, теоретически я должен получить такой список:

>>> ["Hello World!", "This is your captain speaking."]

Но вывод, который я на самом деле получаю, выглядит следующим образом:

>>> [' World', ' speaking']

документация указывает, что findall выполняет поиск слева направо и что * и + операторы обрабатываются жадно. Цените помощь.


person Lee Richards    schedule 06.05.2017    source источник
comment
Когда вы используете группы захвата с re.findall, он возвращает только набор захватов, но не полное совпадение. Измените группу захвата (...) на группу без захвата (?:...). (и первые от \w+ до \w*). Ваша проблема не имеет ничего общего с жадностью.   -  person Casimir et Hippolyte    schedule 07.05.2017
comment
Да, это сработало. Спасибо пачка.   -  person Lee Richards    schedule 07.05.2017
comment
Это не точная копия stackoverflow.com/questions/ 31915018/ . В этом вопросе возникла непонятная проблема двойного экранирования \\ внутри необработанной строки. Этот вопрос более четко затрагивает суть одной проблемы, а именно поведения re.findall() при захвате групп.   -  person Raymond Hettinger    schedule 07.05.2017


Ответы (2)



Вы можете несколько изменить свое регулярное выражение:

>>> re.findall(r"[A-Z][\w\s]+[!.,;:]", text)
['Hello World!', 'This is your captain speaking.']
person dawg    schedule 08.05.2017