Регулярное выражение Python: жадный шаблон, возвращающий несколько пустых совпадений

Этот шаблон предназначен просто для захвата всего в строке вплоть до первой границы потенциального предложения в данных:

[^\.?!\r\n]*

Выход:

>>> pattern = re.compile(r"([^\.?!\r\n]*)")
>>> matches = pattern.findall("Australians go hard!!!") # Actual source snippet, not a personal comment about Australians. :-)
>>> print matches
['Australians go hard', '', '', '', '']

Из документации Python:

re.findall (pattern, string, flags = 0)

Вернуть все неперекрывающиеся совпадения шаблона в строке в виде списка строк. Строка сканируется слева направо, и совпадения возвращаются в указанном порядке. Если в шаблоне присутствует одна или несколько групп, вернуть список групп; это будет список кортежей, если шаблон имеет более одной группы. Пустые совпадения включаются в результат, если они не касаются начала другого совпадения.

Теперь, если строка сканируется слева направо и оператор * является жадным, имеет смысл, что первое возвращаемое совпадение - это целая строка до восклицательных знаков. Однако после того, как эта часть была израсходована, я не вижу, как шаблон выдает пустое совпадение ровно четыре раза, предположительно путем сканирования строки влево после «d». Я понимаю, что оператор * означает, что этот шаблон может совпадать с пустой строкой, я просто не вижу, как бы он делал это более одного раза между завершающим «d» букв и ведущим «!» пунктуации.

Добавление якоря ^ имеет такой эффект:

>>> pattern = re.compile(r"^([^\.?!\r\n]*)")
>>> matches = pattern.findall("Australians go hard!!!")
>>> print matches
['Australians go hard']

Поскольку это исключает совпадения с пустой строкой, это может указывать на то, что указанные пустые совпадения имели место до начала «A» строки. Но это, казалось бы, противоречило документации в отношении совпадений, возвращаемых в найденном порядке (совпадения перед первой буквой «А» должны были быть первыми), и, опять же, ровно четыре пустых совпадения сбивают меня с толку.

Ответы на вопрос(1)

Ваш ответ на вопрос