6

以下脚本用于查找蛋白质序列中的一个基序。

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)=@_;
    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)=@_;
    use strict;
    my @position=();
    while ($sequence=~ /$regexp/ig){
        push (@position, $-[0]);
    }
    return @position;
}

我不确定如何扩展它以在包含蛋白质序列的给定文件中查找多个基序(以固定顺序,即motif1、motif2、motif3)。

4

3 回答 3

2

您可以简单地使用序列的交替(由 分隔|)。这样,正则表达式引擎可以匹配的每个序列都会匹配。

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

然后你可以通过查看来测试这个匹配$1

于 2009-05-06T23:30:33.550 回答
0

如果您想以特定顺序查找这些主题,但可能有些分开,您可以使用类似的东西:

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

(/x 允许在正则表达式中使用空格,.* 匹配零个或多个字符)

于 2009-05-07T00:09:11.960 回答
0

你只是在寻找子字符串吗?如果是这种情况,几个正则表达式可能会让你到达你需要去的地方。但这类问题往往会迅速升级,最有可能出现在下周的问题集中。如果是后者,并且您需要进行比较,您可能需要开始研究动态对齐算法、最小编辑距离、维特比对齐、hmms 等。

此外,如果您正在处理大型输入文件,您可能会考虑预编译您的正则表达式以获得良好的速度提升,

perl 预编译的正则表达式

于 2009-05-07T00:51:02.153 回答