有很多问题要求找到最长的重复子串:

  • Longest substring that occurs at least twice: C++ question
  • Find longest repeating substring in JavaScript using regular expressions
  • Find longest repeating strings?
  • Regex to match the longest repeating substring

  • 但这些并不完全符合我的要求,即:
  • 子串不能重叠(它们是不相交的)。
  • 子串可以不相邻。
  • 允许使用任何字符。
  • 我想像这样匹配最长的模式。

  • 到目前为止,我有这个:
    >>> 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/

    10-12 14:01