Регулярное выражение: подсчет количества раз, когда подстрока встречается в строке, включая перекрывающиеся вхождения [дубликаты]

Я решаю задачу на rosalind, которая хочет, чтобы вы вернули позиции, в которых подстрока встречается в более длинной строке. Единственная проблема заключается в том, что происходит перекрытие, и вывод должен быть: 1, 3, 9 (при условии, что счет основан на 0), но я получаю только 1 и 9? Вот мой код.

import re

s='GATATATGCATATACTT'
t='ATAT'

substrings=re.compile('ATAT')
matches=substrings.finditer(s)

for match in matches:
     print(match.start()+1)  #doesn't find overlapping ones

Любая помощь будет оценена, спасибо!


person pythonbeginner2506    schedule 25.04.2016    source источник


Ответы (3)


Если вы можете установить сторонний модуль, модуль regex имеет расширенную версию API модуля re, которая позволяет передавать аргумент overlapped=True в findall и finditer.

https://pypi.python.org/pypi/regex

В противном случае вы сможете адаптировать этот ответ.

person kindall    schedule 25.04.2016
comment
Один голос за модуль regex. - person CodenameLambda; 25.04.2016

Вам нужно использовать просмотр вперед.

import re
s='GATATATGCATATACTT'
t='ATAT'
print([match.start() for match in re.finditer('(?=%s)' % t, s)])

Вывод:

[1, 3, 9]
person Pythonista    schedule 25.04.2016
comment
Не могли бы вы на самом деле объяснить, что такое просмотр вперед? Я новичок в python (на самом деле новичок в программировании) и никогда не слышал эту фразу? Как это работает? - person pythonbeginner2506; 25.04.2016
comment
Я думаю, это может помочь stackoverflow.com/questions /2973436/ и этот rexegg.com/regex-lookarounds.html . - person Pythonista; 25.04.2016

10-секундный поиск показал это.

В основном вы должны окружить свое регулярное выражение "(?=" и ")". Это положительный прогноз, в результате чего регулярное выражение не блокирует части строки для будущих совпадений.

Обязательно захватите группу 1.

Я надеюсь, что смог помочь,

Кодовое имяLambda

person CodenameLambda    schedule 25.04.2016