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

Esa*_*yol 6 python regex iteration

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

例如 :

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

此代码返回:

<re.Match object; span=(0, 11), match='ali. veli. '>
Run Code Online (Sandbox Code Playgroud)

我需要;

['ali. veli', 'veli. ahmet.']
Run Code Online (Sandbox Code Playgroud)

我怎么能用正则表达式做到这一点?

Wik*_*żew 3

(\w+\.\s){1,2}模式包含一个重复的捕获组,Pythonre不会存储它找到的所有捕获,它只将最后一个捕获到组内存缓冲区中。无论如何,您不需要重复的捕获组,因为您需要从字符串中提取多次出现的模式,并且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']
Run Code Online (Sandbox Code Playgroud)

查看Python 演示

图案的意思是

  • (?=- 积极展望的开始
    • \b - 单词边界(这里很重要,必须只在单词边界处开始捕获)
    • (\w+\.\s+\w+)- 捕获组 1:1+ 个单词字符、、.1+ 个空格和 1+ 个单词字符
  • )- 前瞻结束。