【问题标题】:Why does Regex finditer only return the first result为什么Regex finditer只返回第一个结果
【发布时间】:2019-10-06 10:14:44
【问题描述】:

我的字符串是一个成绩单,我想捕捉说话者,特别是他们的第二个名字(只有在完全大写时才需要匹配) 此外,我想匹配他们的演讲直到下一位演讲者开始,我想最终在一个巨大的文本文件中循环这个过程。

问题是匹配只返回一个匹配对象,即使有两个不同的说话者。我也尝试过使用 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 提供了不同的结果。

【问题讨论】:

  • 只有当子字符串后面跟着单词“Senator”时,你的正则表达式才匹配(因为"(?=Senator)")。您示例中的第二个子字符串不匹配,因为它后面没有“Senator”。

标签: python regex string match


【解决方案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|$)

如果您想在Senator 之上考虑MrDr

【讨论】:

    猜你喜欢
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多