为什么Regex finditer只返回第一个结果

时间:2019-05-20 04:10:09

标签: python regex string match

我的字符串是笔录,我想捕获说话者,特别是他们的名字(只有大写时才需要匹配) 另外,我想匹配他们的语音,直到下一位发言者开始讲话为止,我希望最终在一个巨大的文本文件上循环此过程。

问题是即使有两个不同的说话者,比赛也只会返回一个比赛对象。我也尝试过使用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 个答案:

答案 0 :(得分:1)

只需将正则表达式替换为:

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

演示:https://regex101.com/r/gJDaWM/1/

使用当前的正则表达式,您将强制执行以下条件:每次匹配都必须通过正向提前Senator进行。

您实际上可能必须将正向前瞻更改为:

(?=Senator|Mr|Dr|$)

如果您要考虑Mr上方的DrSenator