найти положение идентифицированных паттернов в последовательности белка - PullRequest
1 голос
/ 12 апреля 2020

Я пытаюсь написать код, чтобы найти шаблоны в последовательности белка, а затем найти позиции (начало и конец) для идентифицированного шаблона. Для идентифицированного шаблона, когда я ищу индекс с помощью .index (), я не получаю правильную начальную позицию, если есть несколько шаблонов. Но здесь я хочу, чтобы начальная и конечная позиция для идентифицированных моделей. Я ищу легкий и быстрый способ, а не BLAST.

import re
from io import StringIO

from Bio import SeqIO

sequence = StringIO(""">seq
FWSTQALLPTTLLGASP
""")

for seqs in SeqIO.parse(sequence, "fasta"):
    # to find pattern
    p = re.compile("L*")
    seqstr = str(seqs.seq)
    patternA = p.findall(seqstr)
    print(patternA)
    for t in patternA:
        print(seqstr.index(t))

Ожидаемый результат: 7 LL 8 12 LL 13 Заранее спасибо.

1 Ответ

0 голосов
/ 12 апреля 2020

re.finditer - это то, что вы, вероятно, хотите использовать, поскольку оно даст вам match object, которые имеют start и end координаты совпадения; они могут быть использованы для нарезки подстроки из исходной строки.

import re
from io import StringIO

from Bio import SeqIO

sequence = StringIO(
    """>seq
FWSTQALLPTTLLGASPL
"""
)

for seqs in SeqIO.parse(sequence, "fasta"):
    # to find pattern
    p = re.compile("L*")
    seqstr = str(seqs.seq)
    matches = p.finditer(seqstr)

    for m in matches:
        if m.group():
            start, end = m.span()
            print(
                "{start} {match} {end}".format(start=start, match=m.group(), end=end)
            )

Что выводит:

6 LL 8
11 LL 13

Примечание к строкам в python, они основаны на нуле , что означает, что первый символ пронумерован 0. Стоит прочитать учебник по строкам . Вкратце, используя вашу последовательность:

           +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
           | F | W | S | T | Q | A | L | L | P | T | T | L | L | G | A | S | P |
           +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
slice pos: 0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17
index pos:   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16

# So using the output you can see:
>>> seq[6:8]
'LL'
...