0

私はアクセッション番号と 16S rrna 配列のファイルを持っています。私がやろうとしているのは、RNA のすべての行を削除し、アクセッション番号と種名を含む行のみを保持することです (そしてその間のジャンクをすべて削除します)。したがって、私の入力ファイルは次のようになります (アクセッション番号の前に > があります):

> D50541 1 1409 1409bp rna Abiotrophia defectiva Aerococcaceae
CUGGCGGCGU GCCUAAUACA UGCAAGUCGA ACCGAAGCAU CUUCGGAUGC UUAGUGGCGA ACGGGUGAGU AACACGUAGA UAACCUACCC UAGACUCGAG GAUAACUCCG GGAAACUGGA GCUAAUACUG GAUAGGAUAU AGAGAUAUAUAUAGAGAUAUAUAU... など

> AY538167 1 1411 1411bp rna アコレプラズマ ヒッピコン アコレプラズマ科
CUGGCGGCGU GCCUAAUACA UGCAAGUCGA ACGCCUUAUA GCAAUAUAGG GAGUGGCGAA CGGGUGAGUA ACACGUAGAU AACCUACCCU UACUUCGAGG AUAACUUCGG GAAACUGGAG CUAAUACUGG AUGUAGGAAUCAUA UUGAGGCAUUC UUAAU ...

出力を次のようにします。

>D50541 アビオトロフィア ディフェティバ アエロコッカス科

>AY538167 アコレプラズマ ヒッピコン アコレプラズマ科

私が書いたコードは、私が望むことを行います...ほとんどの行で。次のようになります。

    #!/usr/bin/env python

    # take LTPs111.compressed fasta and reduce to accession numbers with names.
    import re
    infilename = 'LTPs111.compressed.fasta'
    outfilename = 'acs.fasta'

    regex = re.compile(r'(>)\s(\w+).+[rna]\s+([A-Z].+)')    

    #remove extra letters and spaces
    with open(infilename, 'r') as infile, open(outfilename, 'w') as outfile:
        for line in infile:
            x = regex.sub(r'\1\2 \3', line)
    #remove rna sequences
        for line in x:
            if '>' in line:
                outfile.write(x)

場合によっては、コードが一部の名前をスキップしているように見えることがあります。たとえば、上記の最初のアクセッション番号については、次の情報しか返されませんでした。

>D50541 アエロコッカス科

私のコードがこれを行っているのはなぜですか? 各アクセッション番号の入力は同じように見え、「rna」と名前の間のスペースは各行で同じです (5 スペース)。

アイデアがあるかもしれない人に感謝します!

4

2 に答える 2

0

括弧内の項目は文字クラスであるため、「[rna]」を検索するように正規表現を設定すると、 r、n、または a のいずれかを含む行を要求しますが、3 つすべてを要求するわけではありません。

さらに、必要なすべての行に「bp rna」というパターンがある場合は、それを使用してそれらの行をヤンクします。ファイルを行ごとに読み取ることにより、たとえば、次のようにして、迅速で汚い行ヤンカーに対して機能しました。

regex = re.compile(r'^[\w\s]+bp rna .*$')

しかし、繰り返しますが、「bp rna」を含む行を見つけるのと同じくらい簡単な場合は、ファイルを行ごとに読み取り、正規表現を完全に無視できます。

for line in file:
   if "bp rna" in line:
     print(line) 

編集:リクエストを十分に注意深く読まなかったために吹き飛ばされました。たぶん、キャプチャと置換の正規表現が役立つでしょうか?

for line in file:
  if "bp rna" in line:
    subreg = re.sub(r'^(>[\w]+)\s[\d\s]+bp\srna\s([\w\s]+$)', r"\1 \2", line)
    print(subreg)

出力:

>AY538166 Acholeplasma granularum Acholeplasmataceae

>AY538167 Acholeplasma hippikon Acholeplasmataceae

これは、必要なものの間の空白 (タブまたはスペース) と一致する必要があります。

于 2013-05-06T18:56:23.713 に答える