0

前回はアドバイスありがとうございました

別の正規表現の問題があります:

今、私はこのパターンのリストを持っています:

*7  3   279 0
*33 2   254 0.0233918128654971
*39 2   276 0.027431421446384

Fasta 形式の DNA シーケンスを含むファイル:

改行を編集

>OCTU1
GCTTGTCTCAAAGATTAAGCCATGCATGTATAAGCACAAGCCTAAAATGGTGAAGCCGCGAATAGCTCATTACAACAGTCGTAGTTTATTGGAAAGTTCACTATGGATAACTGTGGTAATTCTAGAGCTAATACATGTTCCAATCCTCGACTCACGGAGAGGTGCATTTATTAGAACAAAGCTGATCAGACTATGTCTGTCTCAGGTTGACTCTGAATAACTTTGCTAATCGCACAGTCTTTGTACTGGCGATGTATCTTTCATGCTATGTA
>OCTU2
GCTGCTTCCTTGGATGTGGTAGCCGTTTCTCAGGCTCCCTCTCCGGAATCGAACCCTATTCCCCGTTACCCGTTCAACCATGGTAGGCCCTACTACCATCAAAGTTGATAGGGCAGATATTTGAAAGACATCGCCGCACAAAGGCTATGCGATTAGCAAAGTTATTAGATCAACGACGCAGCGATCGGCTTTGACTAATAAATCACCCCTCCAGTTGGGGACTTTTACATGTATTAGCTCTAGAATTACCACAGTTATCCATTAGTGAAGTACCTTCCAATAAACTATACTGTTTAATGAGCCATTCGCGGTTTCACCGTAAAATTAGGTTGTCTTAGACATGCATGGCTTAATCTTTGTAGACAAGC

Fasta ファイル (例: >OCTU7 および >OCTU33) で * を含むリスト内の番号 (例: 7 または 33) を検索し、リストに存在する Fasta シーケンスのみを別のファイルにコピーする必要があります。私のスクリプトです:

regex=re.compile(r'.+\d+\s+')
OCTU=b.readlines()
while OCTU:
    for line in a:
        if regex.match(OCTU)==line:
              c.write(OCTU)

スクリプトは機能しているようですが、作成されたファイルが空であるため、パターンが正しくないと思います。

貴重なアドバイスをいただきありがとうございます。

4

3 に答える 3

1

最初にファイルから ID 番号を収集して、a後で高速に検索できるようにすることができます。

seta = set()
regexa = re.compile(r'\*(\d+)') #matches asterisk followed by digits, captures digits
for line in a:
    m = regexa.match(line)      #looks for match at start of line
    if m:
        seta.add(m.group(1))

次に、b をループします。b.next()ループ内で使用して、シーケンスがある 2 行目を取得します。

regexb = re.compile(r'>OCTU(\d+)')  #matches ">OCTU" followed by digits, captures digits
for line in b:
    m = regexb.match(line)
    if m:
        sequence = b.next() 
        if m.group(1) in seta:
            c.write(line)
            c.write(sequence)
于 2013-02-20T13:24:58.120 に答える
0

fasta ファイルを解析するために Biopython を使用することもできます。

次に、番号を切り出してリストで検索し、シーケンスとシーケンス名により確実にアクセスできます... fasta ファイルに行の折り返しがある場合、上記の方法では問題が発生する可能性があります...

import collections
from Bio import SeqIO

infile = "yourfastafile.fasta"
outfile = "desired_outfilename.fasta"

dct = collections.OrderedDict()
for record in SeqIO.parse(open(infile), "fasta"):
    dct[record.description()] = str(record.seq).upper()

for k,v in dct.items():
    if int(k[4:]) in seta: #from answer above
        with open(outfile, "a") as handle:
            handle.write(">" + k + "\n" + str(v) + "\n")
于 2016-07-18T09:39:12.163 に答える