Как сгруппировать заголовок файла fasta - PullRequest
1 голос
/ 25 января 2020

Заголовки моего файла fasta выглядят так:

>ref|NC_001133| [org=Saccharomyces cerevisiae] [strain=S288C] [moltype=genomic] [chromosome=I]

>ref|NC_001134| [org=Saccharomyces cerevisiae] [strain=S288C] [moltype=genomic] [chromosome=II]

>ref|NC_001135| [org=Saccharomyces cerevisiae] [strain=S288C] [moltype=genomic] [chromosome=III]

>ref|NC_001136| [org=Saccharomyces cerevisiae] [strain=S288C] [moltype=genomic] [chromosome=IV]

>ref|NC_001137| [org=Saccharomyces cerevisiae] [strain=S288C] [moltype=genomic] [chromosome=V]

>ref|NC_001138| [org=Saccharomyces cerevisiae] [strain=S288C] [moltype=genomic] [chromosome=VI]

>ref|NC_001139| [org=Saccharomyces cerevisiae] [strain=S288C] [moltype=genomic] [chromosome=VII]

>ref|NC_001140| [org=Saccharomyces cerevisiae] [strain=S288C] [moltype=genomic] [chromosome=VIII]

>ref|NC_001141| [org=Saccharomyces cerevisiae] [strain=S288C] [moltype=genomic] [chromosome=IX]

>ref|NC_001142| [org=Saccharomyces cerevisiae] [strain=S288C] [moltype=genomic] [chromosome=X]

>ref|NC_001143| [org=Saccharomyces cerevisiae] [strain=S288C] [moltype=genomic] [chromosome=XI]

>ref|NC_001144| [org=Saccharomyces cerevisiae] [strain=S288C] [moltype=genomic] [chromosome=XII]

>ref|NC_001145| [org=Saccharomyces cerevisiae] [strain=S288C] [moltype=genomic] [chromosome=XIII]

>ref|NC_001146| [org=Saccharomyces cerevisiae] [strain=S288C] [moltype=genomic] [chromosome=XIV]

>ref|NC_001147| [org=Saccharomyces cerevisiae] [strain=S288C] [moltype=genomic] [chromosome=XV]

>ref|NC_001148| [org=Saccharomyces cerevisiae] [strain=S288C] [moltype=genomic] [chromosome=XVI]

>ref|NC_001224| [org=Saccharomyces cerevisiae] [strain=S288C] [moltype=genomic] [location=mitochondrion] [top=circular]

Мне нужно заменить каждый соответствующий >ref|NC_001133| для соответствующего местоположения, например, '[chromosome = I]', потому что я хочу получить правильное формат для предстоящих прогонов, но сначала я хочу сгруппировать каждый раздел заголовка, используя регулярные выражения; однако в последней строке раздел митохондрии усложняет мне правильную группировку каждого элемента. Я действительно надеюсь, что вы могли бы помочь группировке с помощью регулярных выражений.

Это часть моего кода, которую я пытался сделать:

#!/usr/bin/env python


import re
import subprocess
from sys import argv

def get_fasta_rec(input_fasta):
        """Find all FASTA entries in a FASTA file, change the headers and return them in a dictionary.

        input_fasta -- FASTA file name
        record_dict -- dict, {header:seq}
        """
        entries = input_fasta.split(">")[1:]
        dict_entry = {}
        for entry in entries:
                header, x, seq = entry.partition("\n")
                m = re.search("(.+) (.+\s.+) (.+) (.+) (.+|('[location=mitochondrion] [top=circular]'))", header)

                if m:
                    ref = m.group(1)

                    org = m.group(2)

                    strain = m.group(3)

                    moltype = m.group(4)

                    location = m.group(5)


if __name__ == '__main__':
        input_fasta = open(argv[1]).read()
        get_fasta_rec(input_fasta)

Вывод, который я хотел бы получить для каждого заголовка:

> [chromosome=I] [org=Saccharomyces cerevisiae] [strain=S288C] [moltype=genomic] [ref|NC_001133|]
> [location=mitochondrion] [top=circular] [org=Saccharomyces cerevisiae] [strain=S288C] [moltype=genomic] [ref|NC_001224|]

Спасибо заранее за вашу помощь.

Ответы [ 3 ]

0 голосов
/ 25 января 2020

Я бы не использовал здесь регулярные выражения. Простое разбиение и форматирование строк будет работать просто отлично.

h = '>ref|NC_001133| [org=Saccharomyces cerevisiae] [strain=S288C] [moltype=genomic] [chromosome=I]'   
#h = '>ref|NC_001224| [org=Saccharomyces cerevisiae] [strain=S288C] [moltype=genomic] [location=mitochondrion] [top=circular]'

fields = h[1:].split() #[1:] so you skip the >

if len(fields) == 6:
    new_h = [fields[-1]] + fields[1:-1] + [f'[{fields[0]}]']

elif len(fields) == 7: #extra filed for the mitocondrion case
    new_h = [fields[-2]] + fields[1:-2] + [fields[-1]] + [f'[{fields[0]}]']

new_h = f'> {" ".join(new_h)}'

print(new_h)
> [chromosome=I] [org=Saccharomyces cerevisiae] [strain=S288C] [moltype=genomic] [ref|NC_001133|]
0 голосов
/ 25 января 2020

Вы можете немного оптимизировать шаблон, используя отрицательный класс символов, соответствующий любому символу, кроме закрывающей квадратной скобки \[[^[\]]+\]

В 5-й группе вы можете повторить сопоставление тех же шаблонов, чтобы получить 1 целую группу.

(>ref\|NC_\d+\|)( \[[^[\]]+\])( \[[^[\]]+\])( \[[^[\]]+\])( \[[^[\]]+\](?: \[[^[\]]+\])*)

Regex demo | Python demo

В качестве замены используйте

>\5\2\3\4[\1]

Например, используя re.sub

import re

regex = r"(>ref\|NC_\d+\|)( \[[^[\]]+\])( \[[^[\]]+\])( \[[^[\]]+\])( \[[^[\]]+\](?: \[[^[\]]+\])*)"

test_str = (">ref|NC_001133| [org=Saccharomyces cerevisiae] [strain=S288C] [moltype=genomic] [chromosome=I]\n"
    ">ref|NC_001224| [org=Saccharomyces cerevisiae] [strain=S288C] [moltype=genomic] [location=mitochondrion] [top=circular]")

subst = r">\5\2\3\4[\1]"
result = re.sub(regex, subst, test_str)

print (result)

Выход

> [chromosome=I] [org=Saccharomyces cerevisiae] [strain=S288C] [moltype=genomic][>ref|NC_001133|]
> [location=mitochondrion] [top=circular] [org=Saccharomyces cerevisiae] [strain=S288C] [moltype=genomic][>ref|NC_001224|]
0 голосов
/ 25 января 2020

См. Regex101 для объяснения

(?:(>ref\|.+\|)\s)?((?:\[[\S\d]+=[^\]]+\])+)\s?

Вам нужно будет использовать re.findall(...), и ваши группы атрибутов будут в группе 2 в каждый матч.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...