检测字符串中的重复项
我遇到了一个简单的问题,但就是想不出简单的解决办法 :)
假设我有一个字符串。我想检测里面是否有重复的部分。
我想要的是:
"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)]
这个代码可以找到所有不重叠的重复匹配项,并且使用最短的重复单位。