用正则表达式找到核苷酸序列中的许多匹配

时间:2013-08-30 09:31:47

标签: regex perl while-loop bioinformatics

我有一些基因序列(见下文),我想找到所有开放阅读框(从ATG开始并停止TAG)。

我试过这个:

my $file = ('ACCCTGCCCAAAATCCCCCCGATCGATAGAGCTAAATGGCCCATGATGCATCGACTAGCTAGCTAAAATGTCGATCGATACAGCTAATAG');

while($file =~ /(ATG\w+?TAG)/g){
    print $1;           
} 

但它只给出了

ATGGCCCATGATGCATCGACTAGATGTCGATCGATACAGCTAATAG

我怎样才能得到每一个人?

4 个答案:

答案 0 :(得分:2)

结果没问题,只需将它们分开输出:

print "$1\n";

答案 1 :(得分:2)

你得到两场比赛。为了看到它们,我建议你在它们之间打印一些分隔符:

print "$1\n";

然后我们得到输出:

ATGGCCCATGATGCATCGACTAG
ATGTCGATCGATACAGCTAATAG

如果要查找也出现在另一个内部的帧,则必须确保不要消耗太多字符。通过looahead解决这个问题:

/ATG(?=([ACTG]*+TAG))/g;

然后print "ATG$1\n",输出:

ATGGCCCATGATGCATCGACTAG
ATGATGCATCGACTAG
ATGCATCGACTAG
ATGTCGATCGATACAGCTAATAG

答案 2 :(得分:2)

找到所有出现的诀窍是使用零宽度断言,这将阻止我们的字符“吃掉”:(?=ATG\w+?TAG)

这个问题是我们会得到空匹配,所以解决方案就是使用一个组:
(?=(ATG\w+?TAG))。您将在第1组中找到所有出现的情况。

第1组输出:

ATGGCCCATGATGCATCGACTAG
ATGATGCATCGACTAG
ATGCATCGACTAG
ATGTCGATCGATACAGCTAATAG

Online demo

答案 3 :(得分:0)

如果你想在同一帧中设置起始和终止密码子,不要忘记将结果过滤到长度倍数为3的唯一密码:

print "ATG$1\n" if (length($1)%3) == 0 ;

如果您想检查一个序列中的六个帧,请不要忘记检查互补链:

$comp_chain = reverse($chain) ;
$comp_chain =~ tr/ATCG/TAGC/ ;

然后,您将从单个序列中的六个阅读框中获得开放阅读框。