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

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

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

Я бы хотел:

"blablabla" # => (bla, 3)

"rablabla"  # => (bla, 2)

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

Есть идеи?

РЕДАКТИРОВАТЬ:
Глядя на комментарии, я думаю, мне следует уточнить, что я имею в виду:

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

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

Пример:

"testblblblblb" # => ("bl",4) 
24
задан Rik Poggi 31 January 2012 в 13:46
поделиться

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)]
40
ответ дан 28 November 2019 в 23:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: