正则表达式找到最长的子串,它发生两次(并且与它的双胞胎不相交)

时间:2014-05-02 22:05:22

标签: python regex

有许多问题需要找到最长的重复子字符串:

但这些并不完全符合我的要求,即:

  • 子串可能不重叠(它们是不相交的)。
  • 允许子串不相邻。
  • 允许使用任何字符。
  • 我想像这样匹配最长的模式。

到目前为止,我有这个:

>>> 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并希望继续这样做,但使用其他语言的答案并非不受欢迎。

1 个答案:

答案 0 :(得分:2)

归功于@HamZa的实际正则表达式:(.+)(?=.*\1)。这基本上找到一个至少包含一个字符的捕获组,然后执行非捕获前向预测以确保它重复(这样python没有找到重叠匹配就没有问题了。)

虽然单独使用正则表达式找不到最大值,但编写

非常简单
matches = re.findall(r'(.+)(?=.*\1)',yourstring)
largest = '' if not matches else max(matches,key=lambda m:len(m))