有很多问题要求找到最长的重复子串:
但这些并不完全符合我的要求,即:
到目前为止,我有这个:
>>> m = re.match(".*(?P<grp>.+).*(?P=grp).*", "dhiblhip")
>>> m.group('grp')
'i'
我认为这是匹配最后一个重复的子字符串
'i'
,但这肯定不是最长的。我希望以下输入的输出如下:'123abc'
-> ''
'hh'
-> 'h'
'hihi'
-> 'hi'
'dhiblhip'
-> 'hi'
'phiblhip'
-> 'hi'
(注意我是如何不返回 'p'
因为它没有 'hi'
长,即使它是一个重复的不相交子串。)'racecaracecar'
-> 'raceca'
(注意我不能回收中间的 r
。)在这种情况下,'acecar'
也是可以接受的。 我正在使用 Python 的
re
并希望继续这样做,但另一种语言的答案并不受欢迎。 最佳答案
归功于@HamZa 的实际正则表达式: (.+)(?=.*\1)
。这基本上会找到一个包含至少一个字符的捕获组,然后进行非捕获前瞻以确保它重复(这样python 找不到重叠匹配就不会有问题)。
虽然单独使用正则表达式不可能找到最大的,但编写起来非常简单
matches = re.findall(r'(.+)(?=.*\1)',yourstring)
largest = '' if not matches else max(matches,key=lambda m:len(m))
关于python - 正则表达式查找出现两次的最长子字符串(并且与其孪生不相交),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23437646/