Python:Regex,查找字符串上的重复

Python:Regex,查找字符串上的重复,python,regex,Python,Regex,我需要在文本字符串中查找重复项。 我已经从@Tim Pietzcker那里找到了一个非常优雅的解决方案 我对这个解决方案很满意,但想知道是否有可能进一步扩展它,使它能够接受带空格的字符串 例如“一个bcab c”将返回[(abc,2)] 我尝试使用regex模式“([^\s]+?)\1+”,但运气不佳。 非常感谢您的帮助。使用(\S+?\S?\1),您可以允许字符串中的空格,如下所示,其中空格的位置在重复单词ab c中的相同位置 ab cab c 但是,如果重复单词中的空格位置不相同。这意味

我需要在文本字符串中查找重复项。 我已经从@Tim Pietzcker那里找到了一个非常优雅的解决方案

我对这个解决方案很满意,但想知道是否有可能进一步扩展它,使它能够接受带空格的字符串

例如
“一个bcab c”
将返回
[(abc,2)]

我尝试使用regex模式
“([^\s]+?)\1+”
,但运气不佳。 非常感谢您的帮助。

使用
(\S+?\S?\1
),您可以允许字符串中的空格,如下所示,其中空格的位置在重复单词
ab c
中的相同位置

ab cab c 

但是,如果重复单词中的空格位置不相同。这意味着,你必须用空字符串替换无意义的空格。“用你的方法找到重复的单词。

你应该首先考虑从文本中删除“”。你可以用正则表达式自己来做

>>> def repetitions(s):
...    r = re.compile(r"(.+?)\1+")
...    for match in r.finditer(re.sub(r'\s+',"",s)):
...        yield (match.group(1), len(match.group(0))/len(match.group(1)))
... 
输出

>>> list(repetitions("a bcab c"))
[('abc', 2)]
如果仍要在原始文本中保留空格,请尝试以下正则表达式:
r”(\s*\s+\s*?\s*?)\1+“
。但这有局限性

>>> def repetitions(s):
...    r = re.compile(r"(\s*\S+\s*?\S*?)\1+")
...    for match in r.finditer(s):
...        yield (match.group(1), len(match.group(0))/len(match.group(1)))
... 
结果:

>>> list(repetitions(" abc abc "))
[(' abc', 2)]
>>> list(repetitions("abc abc "))
[('abc ', 2)]
>>> list(repetitions(" ab c ab c "))
[(' ab c', 2)]
>>> list(repetitions("ab cab c "))
[('ab c', 2)]
>>> list(repetitions("blablabla"))
[('bla', 3)]

如果在python中,您可以简单地执行
no_whitespaces=input_str.replace(“,”)
,然后在
no_whitespaces
Hi e.s上执行正则表达式,这是一种可能性,但我的应用程序是在更大的文本结构上查找模式。因此,如果可能,我希望保留它们之间的空格,因为我计划在匹配完成后高亮显示找到的文本。如果您希望在匹配完成后高亮显示找到的文本,根据您上面的示例,输出应为[(a bc,2)]?如果没有,在匹配完成后,您将如何突出显示文本?嗨,Faith,谢谢您的输入,但是空格是不规则的,如我的示例所示。谢谢Sanooj,我最终替换了空格,然后用新编译的正则表达式和添加的空格重新匹配组。例如,匹配项“abc”将被输入到带有“\s*”的新正则表达式中。join('abc')。谢谢,再次感谢你的时间。