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