如何使用正则表达式查找所有重叠的匹配项

6

我有一个很长的 .txt 文件。我想使用正则表达式查找所有匹配结果。

例如:

test_str = 'ali. veli. ahmet.'
src = re.finditer(r'(\w+\.\s){1,2}', test_str, re.MULTILINE)
print(*src)

这段代码返回:
<re.Match object; span=(0, 11), match='ali. veli. '>

我需要:

['ali. veli', 'veli. ahmet.']

我该如何使用正则表达式来实现这个功能?


你试过使用 re.findall 吗? - tmrlvi
1个回答

3

(\w+\.\s){1,2}\w+模式包含一个重复捕获组,Python re 不会存储它找到的所有匹配项,只会将最后一个保存到组内存缓冲区中。无论如何,您不需要重复捕获组,因为您需要从字符串中提取模式的多个出现,并且re.finditerre.findall可以为您完成。

此外,re.MULTILINE标志在此处并不必要,因为模式中没有^$锚点。

您可以使用以下内容获得预期结果:

import re
test_str = 'ali. veli. ahmet.'
src = re.findall(r'(?=\b(\w+\.\s+\w+))', test_str)
print(src)
# => ['ali. veli', 'veli. ahmet']

查看Python示例

该模式的含义为:

  • (?= - 正向先行断言开始
    • \b - 单词边界(在此处很关键,必须仅从单词边界开始捕获)
    • (\w+\.\s+\w+) - 捕获组1:1个或多个单词字符、.、1个或多个空格和1个或多个单词字符
  • ) - 先行断言结束。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接