2009-05-06 18 views
6

次のスクリプトは、タンパク質配列中に1つのモチーフを見つけるためのスクリプトです。タンパク質配列(文字列)内で複数のモチーフ(部分文字列)を見つけるにはどうすればよいですか?

use strict; 
use warnings; 

my @file_data=(); 
my $protein_seq=''; 
my $h= '[VLIM]'; 
my $s= '[AG]'; 
my $x= '[ARNDCEQGHILKMFPSTWYV]'; 
my $regexp = "($h){4}D($x){4}D"; #motif to be searched is hhhhDxxxxD 
my @locations=(); 

@file_data= get_file_data("seq.txt"); 

$protein_seq= extract_sequence(@file_data); 

#searching for a motif hhhhDxxxxD in each protein sequence in the give file 

foreach my $line(@file_data){ 
    if ($motif=~ /$regexp/){ 
     print "found motif \n\n"; 
     } else { 
     print "not found \n\n"; 
    } 
} 
#recording the location/position of motif to be outputed 

@locations= match_position($regexp,$seq); 
if (@locations){ 
    print "Searching for motifs $regexp \n"; 
    print "Catalytic site is at location:\n"; 
    } else { 
    print "motif not found \n\n"; 
} 
exit; 

sub get_file_data{ 
    my ($filename)[email protected]_; 
    use strict; 
    use warnings; 
    my $sequence=''; 

    foreach my $line(@fasta_file_data){ 
     if ($line=~ /^\s*(#.*)?|^>/{ 
      next; 
      } 
     else { 
      $sequence.=$line; 
     } 
    } 
    $sequence=~ s/\s//g; 
    return $sequence; 
} 

sub(match_positions) { 
    my ($regexp, $sequence)[email protected]_; 
    use strict; 
    my @position=(); 
    while ($sequence=~ /$regexp/ig){ 
     push (@position, $-[0]); 
    } 
    return @position; 
} 

Iは、タンパク質配列を含む指定したファイルに(すなわちmotif1、motif2、motif3一定の順序で)複数のモチーフを見つけるためにこれを拡張する方法ではないと確信しています。

+0

あなたのコードでは、いくつかの問題を持っているようです。 19行目で$ lineを宣言しますが、使用されることはありません。 20行目では、$ motifは常に宣言以来変更されていないので、常に ''です。 43行目ではいくつかのelsifを連鎖させていますが、本当に必要なのは 'if($ line =〜/^\ s * $ /または$ line =〜/^\ s *#/または$ line =〜/ > /){next; } else {$ sequence。= $ line; }; '、またはさらに良い:' if($ line =〜/^\s*(#.*)?|^>/){next; } else {$ sequence。= $ line; }; '。私はかっこが 'sub(match_positions)... 'で何をするべきかわからない。 – Svante

答えて

2

シーケンスの変更(|で区切られた)を単に使用することができます。そうすれば、正規表現エンジンはそれぞれのシーケンスとマッチすることができます。

/($h{4}D$x{4}D|$x{1,4}A{1,2}$s{2})/ 

次に、$1を見て、この一致をテストできます。

0

あなたが特定の順序でこれらのモチーフを見つけたいおそらくやや離れている場合は、のようなもの使用することができます

/$h{4}D$x{4}D .* $s{4}D$q{4}/x 

を(/ X、正規表現に空白が可能になります* 0個以上の文字に一致します。 )

0

あなたは部分文字列を探していますか?その場合、正規表現のカップルがおそらくあなたが行く必要がある場所にあなたを得るでしょう。この種の問題はすぐに次の問題の問題になる可能性があります。後者の場合、比較を行う必要がある場合は、ダイナミックアライメントアルゴリズム、最小編集距離、ビタビアラインメント、hmmsなどを調べる必要があるかもしれません。

あなたが大規模な入力ファイルを扱っている場合も、あなたは素敵な速度向上のために、あなたの正規表現をプリコンパイルに見えるかもしれません、

perl pre-compiled regexes

+0

いいえ、彼は部分文字列を探しているだけではありません。彼の正規表現のクラスを見てみましょう。 – Axeman

関連する問題