如何对fasta文件的头进行分组

2024-05-23 22:40:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我的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|,例如,“[chromose=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|]

提前感谢您的帮助


Tags: orgrefinputgrouplocationfastancgenomic
3条回答

请参见Regex101以了解

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

您需要使用re.findall(...),并且在每个匹配中,您的属性组将位于组2中

可以使用与除右方括号\[[^[\]]+\]之外的任何字符匹配的否定字符类稍微优化模式

在第五组中,你可以重复匹配相同的模式,得到一整组

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

Regex demoPython 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|]

我不会在这里使用正则表达式。简单的字符串拆分和格式化就可以了

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|]

相关问题 更多 >