Вот один из способов решения проблемы:
>>> STRs = ['AGATC', 'AATG', 'TATC']
>>> pattern = '|'.join(f'({tgt})+' for tgt in STRs)
>>> for mo in re.finditer(pattern, seq):
print(mo.group(0))
AGATCAGATCAGATCAGATC
TATCTATCTATCTATCTATC
AGATCAGATC
AATG
AGATCAGATC
Ключевые идеи:
1) Используемый шаблон ядра +
для группы, допускающей последовательных повторений:
(AGATC)+
2) Шаблоны объединяются с |
, чтобы позволить любому STR совпадать:
>>> pattern
'(AGATC)+|(AATG)+|(TATC)+'
3) Вызов re.finditer () дает объекты сопоставления по одному за раз.
4) При необходимости объект сопоставления может давать другую информацию, такую как точки начала и окончания, для вычисления длины или кортеж, чтобы показать, какой STR соответствует:
>>> mo.group(0)
'AGATCAGATC'
>>> mo.span()
(171, 181)
>>> mo.groups()
('AGATC', None, None)
Как посчитать максимальное количество повторений:
>>> tracker = dict.fromkeys(STRs, 0)
>>> for mo in re.finditer(pattern, seq):
start, end = mo.span()
STR = next(filter(None, mo.groups()))
reps = (end - start) // len(STR)
tracker[STR] = max(tracker[STR], reps)
>>> tracker
{'AGATC': 4, 'AATG': 1, 'TATC': 5}