我遇到了这个问题,我需要使用正则表达式来查找由另一个单词分隔的重复单词。
因此,如果:
"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']。
提前致谢!
您只需要在初始捕获组之后立即为单词添加否定前瞻,以确保您的正则表达式无法匹配(例如)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)
| 归档时间: |
|
| 查看次数: |
109 次 |
| 最近记录: |