Совпадение и индексирование всех подстрок, включая перекрывающиеся
Я пытаюсь проиндексировать совпадения с помощью нового регулярного выражения findall, чтобы можно было рассматривать перекрывающиеся совпадения. Тем не менее, я мог только найти совпадения, но не могу правильно указать места для них.
Мой код:
import regex as re
seq = "ATCCAAGGAGTTTGCAGAGGTGGCGTTTGCAGCATGAGAT"
substring="GTTTGCAG"
xx=re.findall(substring,seq,overlapped=True)
print xx
хх будет выглядеть
['GTTTGCAG', 'GTTTGCAG']
потому что есть два матча в позициях 10-17 и 25-32.
Однако, как я мог получить эти цифры, пожалуйста? При проверке dir(xx), нет начальной / конечной позиции, которую я мог бы использовать в этой новой функции. (Я пробовал xx.index(substring), но, похоже, это дает только индекс для результирующего списка: например, 0 и 1 в этом случае)
Спасибо.
3 ответа
Используя re.finditer, вы можете получить стартовые локации:
import re
seq = "blahblahblahLALALAblahblahLALA"
substring="LALA"
lenss=len(substring)
overlapsearch="(?=(\\"+substring+"))"
xx=[[x.start(),x.start()+lenss] for x in list(re.finditer(overlapsearch,seq))]
check=[seq[x[0]:x[1]] for x in xx]
print xx
print check
Результаты:
[[12, 16], [14, 18], [26, 30]]
['LALA', 'LALA', 'LALA']
И результаты, используя ваш оригинальный пример:
[[9, 17], [24, 32]]
['GTTTGCAG', 'GTTTGCAG']
Добавление "?=" К поиску подстроки говорит регулярному выражению, что в следующем совпадении могут использоваться символы из предыдущего совпадения
Это итерация для подстрок с длиной, равной длине шаблона, и сравнение с нашим шаблоном. Если они одинаковы, запомните начальный и конечный индекс в строке. Это простое понимание списка.
sequence = "ATCCAAGGAGTTTGCAGAGGTGGCGTTTGCAGCATGAGAT"
substring = "GTTTGCAG"
def find_indexes(seq, sub):
return [(sub, i, len(sub)+i) for i in range(0, len(seq), 1) if seq[i:len(sub)+i] == sub]
print find_indexes(sequence, substring)
Из:
[('GTTTGCAG', 9, 17), ('GTTTGCAG', 24, 32)]
Если вы не используете регулярные выражения, вы можете просто несколько раз вызвать string.find()
с необязательным аргументом начала.
Например:
sequence = "ATCCAAGGAGTTTGCAGAGGTGGCGTTTGCAGCATGAGAT"
substring="GTTTGCAG"
def find_endpoints(seq, sub):
off = 0
matches = []
while True:
idx = seq.find(substring, off)
if idx == -1: break
matches.append((idx, idx+len(sub)))
off = idx + 1
return matches
for (s,e) in find_endpoints(sequence, substring):
print(s, e, sequence[s:e])
Выходы:
(9, 17, 'GTTTGCAG')
(24, 32, 'GTTTGCAG')
Замечания: (s,e)
начальный индекс (включительно) и конечный индекс (исключая) подстроки.