Python Regex:匹配由一个其他单词完全分隔的任何重复单词

cod*_*ine 2 python regex

我遇到了这个问题,我需要使用正则表达式来查找由另一个单词分隔的重复单词。

因此,如果:

"all in all" 将返回: "all"

"good good good"将返回:(Null同一个词不是另一个词)

我试过了:

p = re.compile(r'(\b\w+\b)\s\w+\s\1')
m = p.findall('all in all day in and day out bit by bit good good good')

print(m)
Run Code Online (Sandbox Code Playgroud)

这会返回['all', 'bit', 'good'],但我只希望它返回['all','bit']

提前致谢!

Nic*_*ick 7

您只需要在初始捕获组之后立即为单词添加否定前瞻,以确保您的正则表达式无法匹配(例如)good good

import re

p = re.compile(r'(\b\w+\b)(?!\s\1\b)\s\w+\s\1\b')
m = p.findall('all in all day in and day out bit by bit good good good')

print(m)
Run Code Online (Sandbox Code Playgroud)

输出:

['all', 'bit']
Run Code Online (Sandbox Code Playgroud)

如果要包含重叠匹配项,请将整个正则表达式设为正向预测(感谢 @ggorlen):

p = re.compile(r'(?=(\b\w+\b)(?!\s\1\b)\s\w+\s\1\b)')
m = p.findall('foo bar foo bar foo')
Run Code Online (Sandbox Code Playgroud)

输出:

['foo', 'bar', 'foo']
Run Code Online (Sandbox Code Playgroud)

如果您还需要删除重复的匹配项,请转换为 aset并返回到 a list

p = re.compile(r'(?=(\b\w+\b)(?!\s\1\b)\s\w+\s\1\b)')
m = list(set(p.findall('foo bar foo bar foo')))
print(m)
Run Code Online (Sandbox Code Playgroud)

输出:

['foo', 'bar']
Run Code Online (Sandbox Code Playgroud)