0

だから私は4行のコードを持っています

seq= 'ATGGAAGTTGGATGAAAGTGGAGGTAAAGAGAAGACGTTTGA'



OR_0 = re.findall(r'ATG(?:...){9,}?(?:TAA|TAG|TGA)',seq)  

私が最初にやろうとしていることを説明させてください。. . 混乱させて申し訳ありませんが、説明するために最善を尽くします。

だから私は、「ATG」で始まり、その後に「TAA」、「TAG」のいずれかに遭遇するまで、任意の単語文字の 3 単位が続くシーケンスを探しています [例えば、「GGG」、「GTT」、「TTA」など]または 'TGA'また、少なくとも 30 文字の長さにしたいと考えています。. . したがって、{9,}?

これはある程度機能しますが、seqATG GAA GTT GGA TGA AAG TGG AGG TAA AGA GAA GAC GTT TGAがあることに気付いた場合

したがって、この場合、最初の「ATG」から始まり、次の「TAA」、「TAG」、または「TGA」まで進むと、「ATGGAAGTTGGATGA」が見つかるはずです。

ただし、コードの OR_0 行を実行すると、seq 文字列全体が吐き出されます。最初の 'TAA'、'TAG'、または 'TGA' とそれに続く最初の 'ATG' のみを考慮するようにする方法がわかりません

3 単位で読み取ったときに「ATG」の後に別の「ATG」が続く場合は問題ありません。最初からやり直す必要はありませんが、3 単位で読み取ったときに「TAA」、「TAG」、または「TGA」に遭遇した場合停止する必要があります。

私の質問は、「TAA」、「TAG」、または「TGA」の最初の出現ではなく、「ATG」xxx-xxx-[「TAA」、「TAG」または「TGA」] の最長シーケンスを見つける re.findall の理由です。 3 ? 単位の単語文字で区切られた ATG の後

繰り返しますが、これが紛らわしい場合は申し訳ありませんが、このテキストの最初の行に基づいて私が持っている複数のデータセットを台無しにしており、その理由を見つけようとしています.

4

4 に答える 4

2

正規表現が最初の で一致を停止したいTAA|TAG|TGAが、少なくとも 9 つの 3 文字のチャンクがある場合にのみ成功するようにしたい場合は、次の方法が役立ちます。

>>> import re
>>> regexp = r'ATG(?:(?!TAA|TAG|TGA)...){9,}?(?:TAA|TAG|TGA)'
>>> re.findall(regexp, 'ATGAAAAAAAAAAAAAAAAAAAAAAAAAAATAG')
['ATGAAAAAAAAAAAAAAAAAAAAAAAAAAATAG']
>>> re.findall(regexp, 'ATGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATAG')
['ATGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATAG']
>>> re.findall(regexp, 'ATGAAATAGAAAAAAAAAAAAAAAAAAAAATAG')
[]

これは、否定先読みを使用して、3 文字のチャンクが 3 文字のチャンクに一致する前に、そうでない(?!TAA|TAG|TGA)ことを確認します。TAA|TAG|TGA

ただし、aが 3 文字の境界に収まらない場合でも、正常に一致するTAA|TAG|TGAことに注意してください。

>>> re.findall(regexp, 'ATGAAAATAGAAAAAAAAAAAAAAAAAAAATAG')
['ATGAAAATAGAAAAAAAAAAAAAAAAAAAATAG']
于 2013-04-28T08:44:00.907 に答える
1

長さが要件でない場合は、非常に簡単です。

>>> import re
>>> seq= 'ATGGAAGTTGGATGAAAGTGGAGGTAAAGAGAAGACGTTTGA'
>>> regex = re.compile(r'ATG(?:...)*?(?:TAA|TAG|TGA)')
>>> regex.findall(seq)
['ATGGAAGTTGGATGA']

とにかく、あなたの説明によると、以前の正規表現は実際にあなたが望むことをしていると思います:で始まり、で終わる少なくとも30文字の一致を検索します。ATGTGA

あなたの質問では、最初に少なくとも 30 文字の一致が必要であると述べているため、 を入力しますが、その後はすべての{9,}?一致に一致することが期待されます。両方を持つことはできません。どちらかを選択してください。すでに持っている正規表現を保持するよりも長さが重要な場合は、正しい結果が得られます。

于 2013-04-28T08:36:53.397 に答える
0

これを試して:

seq= 'ATGGAAGTTGGATGAAAGTGGAGGTAAAGAGAAGACGTTTGA'
OR_0 = re.findall(r'ATG(?:.{3})*?(?:TAA|TAG|TGA)',seq) 
于 2013-04-28T08:40:21.370 に答える
0

正規表現は必要ありません。

def chunks(l, n):
    """ Yield successive n-sized chunks from l.
    from: http://stackoverflow.com/a/312464/1561176
    """
    for i in xrange(0, len(l), n):
        yield l[i:i+n]

def method(sequence, start=['ATG'], stop=['TAA','TAG','TGA'], min_len=30):
    response = ''
    started = False
    for x in chunks(sequence, 3):
        if x in start:
            started = True
            response += x
        elif x in stop and started:
            if len(response) >= min_len:
                yield response + x
                response = ''
                started = False
            else:
                response += x
        elif started:
            response += x
    yield response

for result in method('ATGGAAGTTGGATGAAAGTGGAGGTAAAGAGAAGACGTTTGA'):
    print result

30 の min_len を使用すると、戻り値は次のようになります。

ATGGAAGTTGGATGAAAGTGGAGGTAAAGAGAAGACGTTTGA

0 の min_len を使用すると、戻り値は次のようになります。

ATGGAAGTTGGATGA
于 2013-04-28T08:25:15.680 に答える