Я просто хотел бы отметить, что если вы буквально пытаетесь найти повторяющиеся шаблоны в строках, вы должны использовать re buildin .
Основываясь на том, что @Selcuk сказал в своемcomment,
l = ['a', 'b', 'a', 'b', 'c', 'd']
print(l)
def consec_pattern(lst, pvs):
# recursively return number of consecutive times pvs (previous pattern)
# occurs in lst (list)
if len(lst) < len(pvs):
return 0 # no occurances of pvs in lst
if lst[:len(pvs)] == pvs: # if pvs is found at the start of lst
shorter = lst[len(pvs):]
return consec_pattern(shorter, pvs) + 1
return 0 # if this is not the case, return 0
print(consec_pattern(l, [*'ab']))
# we can now annotate the list with number of occurances
l = [*'xababcd']
print(*l)
for i in range(len(l)):
# take an element off of l each time you call to find
# the value for the next position
print(consec_pattern(l[i:], [*'ab']), end=' ')
print()
Это решение O (n), если вы хотите последовательные вхождения конкретного подсписка, и его можно использовать для поиска вхождений всех подсписков, но, вероятно, существует гораздо более эффективный способсделайте это, если вам нужны все списки последовательных вхождений.
Редактировать
Используя библиотеку регулярных выражений, вы можете использовать функцию поиска
import re
string = 'xababcdab'
pattern = 'ab'
match = re.search(f'({pattern})+', string)
start, end = match.span()
consecutive_matches = (end-start)//len(pattern)
print(consecutive_matches) # outputs 2