Python正则表达式:匹配任何被另一个单词分隔的重复单词

2024-03-29 08:05:19 发布

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

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

因此,如果:

"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)

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

提前谢谢


Tags: andinrebybitallout单词
2条回答

不需要正则表达式;普通编程结构可以很好地处理这类问题。编写循环并添加条件:

s = 'all in all day in and day out bit by bit good good good'

words = s.split()
result = []

for i in range(len(words) - 2):
    if words[i] == words[i+2] and words[i] != words[i+1]:
        result.append(words[i])

print(result) # ['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)

输出:

['all', 'bit']

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

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

输出:

['foo', 'bar', 'foo']

如果还需要删除重复的匹配项,请转换为set并返回到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)

输出:

['foo', 'bar']

相关问题 更多 >