为什么Regex finditer只返回第一个resu

2024-05-21 04:59:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我的字符串是一个抄本,我想捕捉说话人,特别是他们的第二个名字(只有完全大写时才需要匹配) 另外,我想在下一个演讲者开始之前匹配他们的演讲,我想最终在一个巨大的文本文件上循环这个过程。你知道吗

问题是match只返回一个match对象,即使有两个不同的说话者。此外,我还尝试了带有python风格的在线regex测试程序,但是它们返回的结果非常不同(不知道为什么?)。你知道吗

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)

我想要两个匹配的对象,两个对象都有一个组来表示他们的姓氏和语音。值得注意的是,我还在线使用了Regex调试器,但是python风格在我的终端上为python提供了不同的结果。你知道吗


Tags: 对象字符串re风格过程match名字pattern
1条回答
网友
1楼 · 发布于 2024-05-21 04:59:30

只需将regex替换为:

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

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

对于当前的regex,您正在强制执行一个条件,即每个匹配都必须通过正向前瞻后跟Senator。你知道吗

实际上,您可能需要将正面展望改为:

(?=Senator|Mr|Dr|$)

如果你想考虑MrDrSenator之上。你知道吗

相关问题 更多 >