检测字符串中的重复项

29 投票
1 回答
10648 浏览
提问于 2025-04-17 12:01

我遇到了一个简单的问题,但就是想不出简单的解决办法 :)

假设我有一个字符串。我想检测里面是否有重复的部分。

我想要的是:

"blablabla" # => (bla, 3)

"rablabla"  # => (bla, 2)

问题是我不知道自己在找什么样的模式(我没有“bla”这样的输入)。

有什么想法吗?

编辑:
看到评论后,我觉得我应该再详细说明一下我的想法:

  • 在一个字符串中,要么有一个重复的模式,要么没有。
  • 这个重复的模式可以是任意长度的。

如果有模式的话,它会一直重复,直到字符串结束。但字符串可能会在模式中间结束。

举个例子:

"testblblblblb" # => ("bl",4) 

1 个回答

45
import re
def repetitions(s):
   r = re.compile(r"(.+?)\1+")
   for match in r.finditer(s):
       yield (match.group(1), len(match.group(0))/len(match.group(1)))
>>> list(repetitions("blablabla"))
[('bla', 3)]
>>> list(repetitions("rablabla"))
[('abl', 2)]
>>> list(repetitions("aaaaa"))
[('a', 5)]
>>> list(repetitions("aaaaablablabla"))
[('a', 5), ('bla', 3)]

这个代码可以找到所有不重叠的重复匹配项,并且使用最短的重复单位。

撰写回答