Подтвердить что ты не робот

Обнаружение повторений в строке

У меня простая проблема, но не может прийти с простым решением:)

Скажем, у меня есть строка. Я хочу определить, есть ли в нем повторение.

Мне бы хотелось:

"blablabla" # => (bla, 3)

"rablabla"  # => (bla, 2)

Дело в том, что я не знаю, какой шаблон я ищу (у меня нет "bla" в качестве ввода).

Любая идея?

EDIT:
Увидев комментарии, я думаю, что должен уточнить, что я имею в виду:

  • В строке есть либо шаблон, который повторяется, либо нет.
  • Повторяемый шаблон может иметь любую длину.

Если есть шаблон, он будет повторяться снова и снова до конца. Но строка может заканчиваться в середине шаблона.

Пример:

"testblblblblb" # => ("bl",4) 
4b9b3361

Ответ 1

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)]