0
sequence_list = ['atgttttgatggATGTTTGATTAG','atggggtagatggggATGGGGTGA','atgaaataatggggATGAAATAA']

各要素 (fdna) を sequence_list から取得し、ATG で始まるシーケンスを検索し、TAA、TGA、または TAG のいずれかに到達するまで 3 ずつ読み取ります

sequence_list の各要素は、2 つのシーケンスで構成されます。最初のシーケンスは小文字で、2 番目のシーケンスは大文字になります。結果の文字列は小文字 + 大文字で構成されます

CDS の収集開始 & Upper()

cds_start_positions = []
cds_start_positions.append(re.search("[A-Z]", fdna).start())
fdna = fdna.upper()

大文字のシーケンスの開始位置を見つけたら、インデックス番号を cds_start_positions に記録し、文字列全体 (fdna) を大文字に変換します。

このステートメントは、TAA|TAG|TGA のいずれかが後に続くすべての ATG-xxx-xxx- を収集します。

uORFの収集

ORF_sequences = re.findall(r'ATG(?:...)*?(?:TAA|TAG|TGA)',fdna)

そこで私がやろうとしているのは、ATG-xxx-xxx の後に TAA、TGA、または TAG が続くすべてのオカレンスを収集することです。

入力データは 2 つのシーケンス (小文字の大文字) で構成されており、次の場合にこれらのシーケンスを検索したいと考えています。

1: ATG の後に TAA|TGA|TAG が小文字で続きます (現在は大文字ですが、大文字になった値は cds_start_positions に格納されます)。

2: ATG は小文字部分 (cds_start_position 値未満) であり、それに続く次の TAA|TGA|TAG は大文字です。

注* 現在の設定方法では、元の大文字部分 (cds_start_position 値より大きい) にあった ATG がリストに保存されます。

「Gathering CDS Starts & Upper()」が行うことは、大文字シーケンスの開始位置を見つけることです。

リストcds_start_positionsの対応する要素の前の位置にあるATGのみを認識する「uORFの収集」部分に制限をかける方法はありますか?

リスト「cds_start_positions」の各要素の前に「ATG」のみを見つけるORF_sequences行にステートメントを入れたい

cds_start_positions の例

cds_start_positions = [12, 15, 14] #where each value indicates where the uppercase portion starts in the sequence_list elements (fdna)

sequence_list の最初のシーケンスについては、次の結果が必要です。

#input
fdna = 'atgttttgatggATGTTTGATTAG'
#what i want for the output
ORF_sequences = ['ATGTTTTGA','ATGGATGTTTGA']
#what i'm getting for the output
ORF_sequences = ['ATGTTTTGA','ATGGATGTTTGA','ATGTTTGATTAG']

その 3 番目のエントリは値 12 (リスト cds_start_positions の対応する値) の後にあり、私はそれを望んでいません。ただし、2 番目のエントリには、その値 12 の前に開始 ATG があり、許可されるべき値 12 の後に TAA|TGA|TAG があります。

***注: これらの ATG-xxx-xxx-TAA|TGA|TAG が発生する場所の開始位置を取るだけの別のコード行があります。

start_positions = [i for i in start_positions if i < k-1]

re.findall でこの原則を使用する方法はありますか?

何か明確にする必要がある場合はお知らせください

4

2 に答える 2

1

昨日、私は最初の答えを書きました。

それから私は ATOzTOA の答えを読みました。彼は非常に良いアイデアを持っていました: 肯定的な後読みアサーションを使用します。
私の答えは完全に外れていて、彼の考えは正しい方法だと思いました。
しかし、後で ATOzTOA のコードに欠陥があることに気付きました。

'ATGxzyxyzyyxyATGxzxzyxyzxxzzxzyzyxyzTGA'検査された文字列に部分があるとします。肯定的な一致が発生し'xzyxyzyyxyATGxzxzyxyzxxzzxzyzyxyzTGA' 、前の部分で積極的な一致が発生する'ATG'ため、その部分が一致を構成します。それで大丈夫です。
しかし、これは、この一致の直後に正規表現モーターがこの部分の最後に配置されることを意味し 'xzyxyzyyxyATGxzxzyxyzxxzzxzyzyxyzTGA'ます。
そのため、正規表現モーターが次の一致を検索するとき、'ATG'この部分の現在から始まる一致は見つかりません。これは、それよりずっと後の位置から再び実行されるためです。

.

したがって、質問に必要なものを達成する唯一の方法は、実際に私が書いた最初のアルゴリズムであり、それを再投稿します。

仕事は関数find_ORF_seq()によって行われます

関数Trueの 2 番目のパラメーターに 2 番目の引数として渡すと、アルゴリズムを理解するのに役立つメッセージが出力されます。 そうでない場合、パラメーターはデフォルト値を取りますmessagesfind_ORF_seq()
messagesNone

パターンは'(atg).+?(?:TAA|TGA|TAG)'大文字と小文字で書かれていますが、それは大文字と小文字の相対的な部分が正しくキャッチされる理由ではありません。後でわかるように、フラグre.IGNORECASEが使用されているためです。一致する部分(?:TAA|TGA|TAG)が大文字の部分だけでなく小文字の部分にも含まれる可能性があるため、このフラグが必要です。

アルゴリズムの本質は while ループにあります。これは、上記で説明したように、調査した部分が重複する可能性があるため必要です (私が正しく理解し、あなたが提供したサンプルと説明が正しい限り) . したがって、 or
を使用する可能性はなく、ループを実行します。 findall()finditer()

fdnaシーケンスを次々と繰り返すのを避けるために、文字列内ma.start()の一致の開始位置を与えるメソッドを使用し、 with ( +1maの値をインクリメントして、その時点で再度検索を開始しないようにします。見つかった一致の開始!)ss = s + p + 1

私のアルゴリズムは、start_positions後読みアサーションを使用せず、最初の 3 文字での実際の一致を使用するため、 の情報を必要としません: 一致の開始が大文字の部分にある場合、一致は制約に適合しないと宣言されます。それがma.group(1)最初の3つの塩基をキャッチするとき('ATG'または'atg'正規表現がケースを無視するため)が等しいと言う'ATG'

検索する部分の間隔が 3 塩基の倍数になっていないように見えるので、s = s + p + 1代わりにを入れざるを得ませんでした。s = s + p + 3

import re

sequence_list = ['atgttttgatgATGTTTTGATTT',
                 'atggggtagatggggATGGGGTGA',
                 'atgaaataatggggATGAAATAA',
                 'aaggtacttctcggctaACTTTTTCCAAGT']

pat = '(atg).+?(?:TAA|TGA|TAG)'
reg = re.compile(pat,re.IGNORECASE)

def find_ORF_seq(fdna,messages=None,s=0,reg=reg):
    ORF_sequences = []
    if messages:
        print 's before == ',s
    while True:
        if messages:
            print ('---------------------------\n'
                   's == %d\n'
                   'fdna[%d:] == %r' % (s,s,fdna[s:]))
        ma = reg.search(fdna[s:])
        if messages:
            print 'reg.search(fdna[%d:]) == %r' % (s,ma)
        if ma:
            if messages:
                print ('ma.group() == %r\n'
                       'ma.group(1) == %r'
                       % (ma.group(),ma.group(1)))
            if ma.group(1)=='ATG':
                if messages:
                    print "ma.group(1) is uppercased 'ATG' then I break"
                break
            else:
                ORF_sequences.append(ma.group().upper())
                p = ma.start()
                if messages:
                    print (' The match is at position p == %d in fdna[%d:]\n'
                           ' and at position s + p == %d + %d == %d in fdna\n'
                           ' then I put s = s + p + 1 == %d'
                           % (p,s, s,p,s+p, s+p+1))
                s = s + p + 1
        else:
            break
    if messages:
        print '\n==== RESULT ======\n'
    return ORF_sequences

for fdna in sequence_list:
    print ('\n============================================')
    print ('fdna == %s\n'
           'ORF_sequences == %r'
           % (fdna, find_ORF_seq(fdna,True)))

###############################

print '\n\n\n######################\n\ninput sample'
fdna = 'atgttttgatggATGTTTGATTTATTTTAG'
print '  fdna == %s' % fdna
print '  **atgttttga**tggATGTTTGATTTATTTTAG'
print '  atgttttg**atggATGTTTGA**TTTATTTTAG'
print 'output sample'
print "  ORF_sequences = ['ATGTTTTGA','ATGGATGTTTGA']"

print '\nfind_ORF_seq(fdna) ==',find_ORF_seq(fdna)

.

printアルゴリズムをよりよく理解するための指示のない同じ関数。

import re

pat = '(atg).+?(?:TAA|TGA|TAG)'
reg = re.compile(pat,re.IGNORECASE)

def find_ORF_seq(fdna,messages=None,s =0,reg=reg):
    ORF_sequences = []
    while True:
        ma = reg.search(fdna[s:])
        if ma:
            if ma.group(1)=='ATG':
                break
            else:
                ORF_sequences.append(ma.group().upper())
                s = s + ma.start() + 1
        else:
            break
    return ORF_sequences

.

ATOzTOA の関数と私の関数の 2 つの関数を、欠陥を明らかにするfdnaシーケンスと比較しました。これは、私が説明したことを正当化します。

from find_ORF_sequences import find_ORF_seq
from ATOz_get_sequences import getSequences

fdna = 'atgggatggtagatggatgggATGGGGTGA'

print 'fdna == %s' % fdna
print 'find_ORF_seq(fdna)\n',find_ORF_seq(fdna)
print 'getSequences(fdna)\n',getSequences(fdna)

結果

fdna == atgggatggtagatggatgggATGGGGTGA
find_ORF_seq(fdna)
['ATGGGATGGTAG', 'ATGGTAG', 'ATGGATGGGATGGGGTGA', 'ATGGGATGGGGTGA']
getSequences(fdna)
['ATGGGATGGTAG', 'ATGGATGGGATGGGGTGA']

.

しかし、結局のところ、おそらく、私は.... :の最後の
ように、別のマッチングの内部部分である一致が必要ですか?'ATGGGATGGGGTGA''ATGGATGGGATGGGGTGA'

そうでない場合は、ATOzTOA の回答も一致します。

于 2013-02-14T20:22:09.273 に答える
1

更新 2 - 完全なコード

import re

def getSequences(fdna):
    start = re.search("[A-Z]", fdna).start()
    fdna = fdna.upper()

    ORF_sequences = re.finditer(r'(?<=ATG)(.*?)(?:TAA|TAG|TGA)',fdna)

    sequences = []

    for match in ORF_sequences:
        s = match.start()
        if s < start:
            sequences.append("ATG" + match.group(0))

    print sequences

    return sequences

sequence_list = ['atgttttgatggATGTTTGATTAG','atggggtagatggggATGGGGTGA','atgaaataatggggATGAAATAA']

for fdna in sequence_list:
    getSequences(fdna)

出力

>>> 
['ATGTTTTGA', 'ATGGATGTTTGA']
['ATGGGGTAG', 'ATGGGGATGGGGTGA']
['ATGAAATAA', 'ATGGGGATGA']

アップデート

が必要な場合はre、これを試してください:

ORF_sequences = re.finditer(r'(?<=ATG)(.*?)(?:TAA|TAG|TGA)',fdna)

for match in ORF_sequences:
    print match.span()
    print "ATG" + match.group(0)

出力

>>> 
(3, 9)
ATGTTTTGA
(11, 20)
ATGGATGTTTGA

ノート

これは常に機能するとは限りません。match.start()ただし、に対しての値を確認しcds_start_positionて、不要なシーケンスを削除できます。


ではなく、これを試してみてくださいre...

def getSequences(fdna, start):
    """Find the sequence fully to left of start and
    laying over the start"""

    i = 0
    j = 0
    f = False
    while True:
        m = fdna[i:i+3]
        if f is False:
            if m == "ATG":
                f = True
                j = i
                i += 2
        else:
            if m in ["TAA", "TAG", "TGA"]:
                i += 2
                seq1 = fdna[j: i+1]
                break

        i += 1

    i = 1
    j = 0
    f = False
    while True:
        m = fdna[i:i+3]
        if f is False:
            if m == "ATG" and i < start:
                f = True
                j = i
                i += 2
        else:
            if m in ["TAA", "TAG", "TGA"] and i > start:
                i += 2
                seq2 = fdna[j: i+1]
                break

        i += 1

    print "Sequence 1 : " + seq1
    print "Sequence 2 : " + seq2

テスト

fdna = 'atgttttgatggATGTTTGATTAG'

cds_start_positions = []
cds_start_positions.append(re.search("[A-Z]", fdna).start())

fdna = fdna.upper()

getSequences(fdna, cds_start_positions[0])

出力

>>> 
Sequence 1 : ATGTTTTGA
Sequence 2 : ATGGATGTTTGA
于 2013-02-14T19:50:52.853 に答える