Я оставлю свой принятый ответ как «простой и очевидный способ сделать это» - однако это не распространяется на перекрывающиеся события.Выяснить это можно наивно, с многократной проверкой срезов - как в: sum ("GCAAAAAGH" [i:]. Начинается с ("AAA") для i в диапазоне (len ("GCAAAAAGH")))
(что приводит к 3) - это может быть сделано с помощью трюка с использованием регулярных выражений, как можно увидеть на Регулярное выражение Python находит все перекрывающиеся совпадения? - и это также может быть полезно для игры в тонкий код - Этомой «ручной» счетчик для перекрывающихся вхождений шаблонов в строке, которая пытается быть не наивной (по крайней мере, не создает новые строковые объекты при каждом взаимодействии):
def find_matches_overlapping(text, pattern):
lpat = len(pattern) - 1
matches = []
text = array("u", text)
pattern = array("u", pattern)
indexes = {}
for i in range(len(text) - lpat):
if text[i] == pattern[0]:
indexes[i] = -1
for index, counter in list(indexes.items()):
counter += 1
if text[i] == pattern[counter]:
if counter == lpat:
matches.append(index)
del indexes[index]
else:
indexes[index] = counter
else:
del indexes[index]
return matches
def count_matches(text, pattern):
return len(find_matches_overlapping(text, pattern))