Обнаружение повторений в строке
У меня простая проблема, но не может прийти с простым решением:)
Скажем, у меня есть строка. Я хочу определить, есть ли в нем повторение.
Мне бы хотелось:
"blablabla" # => (bla, 3)
"rablabla" # => (bla, 2)
Дело в том, что я не знаю, какой шаблон я ищу (у меня нет "bla" в качестве ввода).
Любая идея?
EDIT:
Увидев комментарии, я думаю, что должен уточнить, что я имею в виду:
- В строке есть либо шаблон, который повторяется, либо нет.
- Повторяемый шаблон может иметь любую длину.
Если есть шаблон, он будет повторяться снова и снова до конца. Но строка может заканчиваться в середине шаблона.
Пример:
"testblblblblb" # => ("bl",4)
Ответы
Ответ 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)]