Почему Regex finditer возвращает только первый результат? - PullRequest
1 голос
/ 20 мая 2019

Моя строка является расшифровкой, я хочу захватить говорящего, в частности его второе имя (которое должно совпадать только в том случае, если оно полностью написано заглавными буквами). Кроме того, я хочу сопоставить их речь, пока не начнется следующий выступающий, я хочу повторить этот процессв конце концов, из-за огромного текстового файла.

Проблема в том, что сопоставление возвращает только один сопоставляемый объект, даже если есть два разных говорящих.Также я попробовал онлайн тестирование регулярных выражений со вкусом python, однако они возвращают очень разные результаты (не уверены, почему?).

str = 'Senator BACK\n (Western Australia) (21:15): This evening I had the pleasure (...) Senator         DAY\n (South Australia) (21:34): Well, what a week it h(...) ' 

pattern = re.compile("(:?(Senator|Mr|Dr)\s+([A-Z]{2,})\s*(\(.+?\))\s+(\(\d{2}:\d{2}\):)(.*))(?=Senator)")

for match in re.finditer(pattern, str):
    print(match)

Я хочу 2 совпадающих объекта, причем оба объекта имеют группу для этой фамилии и ихречь.Важно также отметить, что я использовал отладчики Regex в Интернете, однако разновидность python дает разные результаты для Python на моем терминале.

1 Ответ

1 голос
/ 20 мая 2019

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

(:?(Senator|Mr|Dr)\s+([A-Z]{2,})\s*(\(.+?\))\s+(\(\d{2}:\d{2}\):)(.*))(?=Senator|$)

demo: https://regex101.com/r/gJDaWM/1/

С вашим текущим регулярным выражением вы выполняете условие, что после каждого матча должно следовать Senator черезположительный взгляд.

Возможно, вам придется изменить положительный взгляд на:

(?=Senator|Mr|Dr|$)

, если вы хотите учесть Mr и Dr поверх Senator.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...