5

私は、DNA シーケンスでオープン リーディング フレームを見つけるためのきれいで Pythonic な方法を見つけることに取り組んでいます。索引付け、フラグ、およびその他の醜さを利用する多くの実装をオンラインで見つけました。

正規表現の実装を作成できると確信していますが、正規表現が苦手です。一般的なアイデアは、「ATG」、「TAG」、「TGA」、および「TAA」によって一連の DNA シーケンスを分割したいということです。しかし、重複領域で分割したくありません。たとえば、シーケンス「ATGA」は「ATG」、「A」に分割する必要があります。基本的に、3 つのフレームのいずれかで左から右に進みます。

わかりやすくするために編集: コメントで述べたように、(ゼロ以外のフレームにある)の存在にもかかわらず、 のようなシーケンスは,ATGATTTTGAに分割する必要がありますATGTTTTGATGA

edit2:これは、リンクされたリスト内包分割を使用して、正規表現なしで実装した方法です。私はフラグの使用が嫌いです。

def find_orf(seq):
    length = 0
    stop = ['TAA','TGA','TAG']
    for frame in range(3):
        orfFlag, thisLen = None, 0
        splitSeq = [seq[start+frame:start+frame+3] for start in range(0,len(seq),3)]
        for codon in splitSeq:
            if codon == 'ATG':
                orfFlag = True
                thisLen += 1
            elif orfFlag and codon in stop:
                orfFlag = None
                if thisLen > length:
                    length = thisLen
            else:
                thisLen += 1
    return length
4

3 に答える 3

2

あなたが提案した正規表現方法が特にPythonicであるかどうかはわかりませんが、基本的な正規表現は次のとおりです。

import re
v=re.compile("((ATG)|(TGA)|(TAG)|(TAA))")
test="CCATGACCCATGCACCATTGAC"
for i in v.findall(test):
   print i

ATGA の一部である最初の TGA を見逃し、2 番目のみを報告します。一般的には、遺伝子のフレームを想定する必要があるため、これは機能しませんが、これは事前にわかっていない可能性があります。

非常に読みやすい方法は、3 つの読み枠すべてに対して単純にリスト内包表記を行うことです。

于 2013-11-04T05:21:00.953 に答える
0

3 文字のすべてのシーケンスだけが必要なのか、それとも特定の 3 文字のシーケンスだけが必要なのかはまだわかりません。ただし、一連の文字の正規表現一致は、それらの文字を「消費」し、一致した文字が後続の正規表現検索と重複しないため、次のようになります。

最初が必要な場合:

r = re.compile('[ATG]{3}')
r.findall('ATGAAATAA')

2番目が必要な場合:

r = re.compile('(ATG|TAG|TGA|TAA|AAA)')
r.findall('ATGAAATAA')

どちらも戻ります: ['ATG', 'AAA', 'TAA']

2 番目のマッチ シーケンスに AAA を自由に追加しました。

于 2013-11-04T05:28:05.997 に答える
0

発電機をお勧めします。非常にきれいで、正規表現を使用せずに理解し/維持するのが簡単です。これは、文字列をチャンクに分割するだけのジョブには不適切なツールです。

def chunks(s, n):
    """Produce `n`-character chunks from `s`."""
    for start in range(0, len(s), n):
        yield s[start:start+n]

chars = "ATGAAATAA"
for chunk in chunks(chars, 3):
    print chunk

出力:

ATG
AAA
TAA

ここで試してみてください: http://ideone.com/4yQw4y

アルゴリズムの実装に対する完全な功績は、ここの答えにあります: 文字列を文字数で分割する

于 2013-11-04T05:21:18.580 に答える