1

私はperlと正規表現を使用して、を使用して最小サイズ45塩基のORF(オープンリーディングフレーム)を見つけています。基本的には、次のことを意味します。文字ATGC(スペースや新しい行は含まない)のみで構成される文字列のサブストリングを検索します。

  1. 「ATG」で始まる
  2. 「TAG」または「TAA」または「TGA」で終わる、
  3. 少なくとも39文字の長さです
  4. 3で割り切れる

私の最初のコードは次のとおりです。

$CDSString = "ATGCACACACACACACACACACACACACACACACACACACACACACACACACACACATGA";
if($CDSString =~ m/(ATG.{45,}(TAG|TAA|TGA))/) 
{
    my $CDSCurrent = $1;
    if ((length($CDSCurrent) % 3) == 0)
    { 
        # do something
    }
}

これは問題なく動作しますが、もっと良い方法があるのではないかと思いました。だから私は試しました:

$CDSString = "ATGCACACACACACACACACACACACACACACACACACACACACACACACACACACATGA";
if ($CDSString =~ m/ATG(...){13,}(TAG|TAA|TGA)/ )
{
    # do something
}

しかし、何らかの理由でその上の文字列と一致せず、その理由がわかりません。誰かがそれを理解できますか?前もって感謝します。

4

2 に答える 2

1

あなたの正規表現は、開始コドンと停止コドンの間のすべてが実際に文字ATGCだけで構成されていることを確認していません。次のものを使用する必要があります。

if ($CDSString =~ m/ATG(?:[ATGC]{3}){13,}(?:TAG|TAA|TGA)/i) {...}

(ただし、元の正規表現も機能しますが、無効な一致を拒否することはありません。そのため、別の場所で別の問題が発生する可能性があります。)

于 2012-04-14T11:33:29.100 に答える
0

これまでのところ、コードに問題があります。あなたが探しているのは、終止コドンの最初のインスタンスです。CDSが適切でない場合は、内部ストップが含まれている可能性があります。内部停止コドンは無効なORFを作るので、もっと精巧なものが必要です。

if($CDSString =~ m/ATG(?:[ATGC]{3}(?<!TAG|TAA|TGA)){13,}(?:TAG|TAA|TGA)/i) {...}

これにより、開始と最初の停止の間に少なくとも13のコドンがある、内部停止のないシーケンスが返されます。

コードのこの部分:(?:[ATGC]{3}(?<!TAG|TAA|TGA))「TAG、TAA、またはTGAではない3つのヌクレオチドに一致する」と言います。(?

実際の動作は次のとおりです。

perl -e '$CDSString = "ATGCACACACACACACACACACACACACACACACACACACACACACACACACACACATAGTAGTAGTGA";if ($CDSString =~ m/(ATG(?:[ATGC]{3}(?<\!TAG|TAA|TGA)){13,}(TAG|TAA|TGA))/ ){print "$1\n"}'
ATGCACACACACACACACACACACACACACACACACACACACACACACACACACACATAG

最後の3つの停止コドン(TAGTAGTGA)はシーケンスの一部として返されないことに注意してください。

于 2015-09-09T18:24:44.553 に答える