2

文字列形式の (DNA) ゲノム シーケンスの 1 本の鎖から重複するすべての ORF を分離しようとしています (ゲノムの開始 (i) と終了 (j) 位置、および ORF の長さ (l) を含む)。ORF は ATG で始まり、少なくとも 24 個の内部ヌクレオチド [ACGT] を持ち、(TAA|TAG|TGA) で終わる必要があります。

perl 正規表現を使用して 45 塩基の最小サイズの ORFを検索することで、この正規表現が機能しない理由を考えました (微調整が必​​要でした)。

    my $genome = $_[0];
    my $ATG_count = 0;
    my $ORF_count = 0;
    my @i = (); 
    my @j = (); 
    my @l = (); 
    my @frames = (); 

    while ($genome =~ m/ATG/ig) {   ### I need to do this to find every ORF starting with ATG, including ORFs which are located inside other ORFs.
        $ATG_count++;
        my $start = $-[0]+1;
        foreach (substr($genome,$-[0]) =~ m/^ATG(?:[ATGC]{3}){8,}(?:TAA|TAG|TGA)/ig) {
            my $length = $+[0];
            if ($length%3 == 0) {   ### I need to do this because sadly, the above regex DOESN'T recover only Strings are dividable by 3. (Why not?!?)
                my $stop = $start+$length;
                my $readingframe = ($start%3);
                push(@i, $start), push(@j, $stop), push(@l, $length), push (@frames, $readingframe);
                $ORF_count++;
            }
        }
    }

さて、上記のコードは、ATG で始まり、(TAA|TAG|TGA) で終わり、>=30 である ORF を回復します - 私はそれを試しました - しかし、回復した ORF には内部停止コドンがあります!

私の質問は、回復した ORF を ATG の後の最初の停止コドンで停止させるにはどうすればよいですか? 私の正規表現の中間部分から (TAA|TAG|TGA) を除外することが1つの可能性だと思います->(?:[ATGC]{3}){8,} しかし、どうすればそれを行うことができますか?

よろしくお願いします!

編集:

わかりました、以下の提案を試した後、ATG で始まり、内部停止コドンを持たない特定のゲノム配列から >=30 bp のすべてのオーバーラップ ORF を回復するソリューションを思いつきました。

    my $genome = $_[0];
    my $ATG_count = 0;
    my $ORF_count = 0;
    my @i = (); 
    my @j = (); 
    my @l = (); 
    my @frames = (); 

    while ($genome =~ m/ATG/ig) {
        $ATG_count++;
        my $start = $-[0]+1;
        foreach (substr($genome,$-[0]) =~ m/^ATG(?:[ATGC]{3})*?(?:TAA|TAG|TGA)/ig) {    
        ### This was changed so that it matches "ATG - first(lazy) stop-codon". 
            my $length = $+[0];
            if ($length%3 == 0 && $length >=30) {    
            ### This was changed so that the matches must be >=30 in length.
                my $stop = $start+$length;
                my $readingframe = ($start%3);
                push(@i, $start), push(@j, $stop), push(@l, $length), push (@frames, $readingframe);
                $ORF_count++;
            }
        }
    }
4

3 に答える 3

2

あなたが書いたパターンは、文字列の最後の停止コドンに到達するまで、貪欲にコドンを検索します。次のようにパターンを書き直してみてください。

m/ATG(?:[ATGC]{3}){8,}?(?:TAA|TAG|TGA)/ig

?to を追加する(?:[ATGC]{3}){8,}?と、最後の終止コドンではなく、最初の終止コドンまで、できるだけ多くのコドンと一致するように正規表現エンジンに指示します。^また、開始コドンがシーケンスの最初のコドンにならないという前提で、パターンから を省略します。

返された文字列に終止コドンが含まれていないことを確認するには、終止コドンをチェックする 2 番目の正規表現テストで結果をラップします。私が見る限り、単一の正規表現パターンでこれに対して可変長の否定後読みテストを行う方法はありません。

于 2013-07-08T14:19:37.857 に答える
1

後にa を追加して、「繰り返し」ユニット ( (?:[ATGC]{3}){8,}) を非遅延にしてみてください。?

^ATG(?:[ATGC]{3}){8,}?(?:TAA|TAG|TGA)
                     ^

最後の停止コドンの前に停止コドンがある最初の 2 つのゲノムの例を参照してください

基本的に、「反復」ユニットの一致を最小限に抑え、最初の 8 ユニット内にない最初の終止コドンで停止します。

ここで、これら 8 ユニット内の終止コドンで停止したい場合は、{8,}'at least 8' を意味するので使用しないでください。代わりに使用してください+。これは、「少なくとも 1」または*少なくとも 0 を意味します。

^ATG(?:[ATGC]{3})+?(?:TAA|TAG|TGA)
                 ^

編集:コメントで議論した後ATGTAA、開始コドンと終了コドンの間にトリプレットがないことを意味するような文字列もあることがわかりました. これは、*上記のように使用すると正しい正規表現になります。

^ATG(?:[ATGC]{3})*?(?:TAA|TAG|TGA)
于 2013-07-08T14:21:43.787 に答える