2012-01-31 54 views
23

我有一个简单的问题,但不能用简单的解决方案:)检测字符串中的重复

比方说,我有一个字符串。我想检测它是否有重复。

我想:

"blablabla" # => (bla, 3) 

"rablabla" # => (bla, 2) 

的事情是,我不知道我在寻找什么花样(我没有“喇嘛”作为输入)。

有什么想法?

编辑:
看到的评论,我觉得我应该更准确一点我的想法是什么:

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

如果有一个模式,它会被一遍又一遍地重复直到结束。但字符串可以在模式中间结束。

实施例:

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

听起来不像一个非常简单的问题我 – Hubro 2012-01-31 12:52:22

+14

我会说'rablabla'应该返回'('abl',2)',不是吗? – 2012-01-31 12:53:13

+0

根据你的例子,重复的字符串的长度为3.所以你只看到长度为3的字符串? – Jayy 2012-01-31 12:54:37

回答

39
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)] 
+1

yay正则表达式解决方案! – 2012-01-31 13:00:20

+0

o_O。我绝对应该看看! – jlengrand 2012-01-31 13:01:31

+0

我正在建议建立一个图表,但我想这样做效率更高;) – Marcin 2012-01-31 13:01:49