Совпадение и индексирование всех подстрок, включая перекрывающиеся

Я пытаюсь проиндексировать совпадения с помощью нового регулярного выражения 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) начальный индекс (включительно) и конечный индекс (исключая) подстроки.

Другие вопросы по тегам