有许多问题需要找到最长的重复子字符串:
但这些并不完全符合我的要求,即:
到目前为止,我有这个:
>>> m = re.match(".*(?P<grp>.+).*(?P=grp).*", "dhiblhip")
>>> m.group('grp')
'i'
我认为这与重复自己的最后一个子串'i'
匹配,但这肯定不是最长的子串。我希望以下输出的输出如下:
'123abc'
- &gt; ''
'hh'
- &gt; 'h'
'hihi'
- &gt; 'hi'
'dhiblhip'
- &gt; 'hi'
'phiblhip'
- &gt; 'hi'
(请注意我不会返回'p'
,因为它不像'hi'
那么长,即使它是重复的不相交子字符串。)'racecaracecar'
- &gt; 'raceca'
(请注意我无法回收中间r
。)在这种情况下,'acecar'
同样可以接受。我正在使用Python的re
并希望继续这样做,但使用其他语言的答案并非不受欢迎。
答案 0 :(得分:2)
归功于@HamZa的实际正则表达式:(.+)(?=.*\1)
。这基本上找到一个至少包含一个字符的捕获组,然后执行非捕获前向预测以确保它重复(这样python没有找到重叠匹配就没有问题了。)
虽然单独使用正则表达式找不到最大值,但编写
非常简单matches = re.findall(r'(.+)(?=.*\1)',yourstring)
largest = '' if not matches else max(matches,key=lambda m:len(m))