Perl正则表达式(以ATG开头,以TAG,TAA或TGA结尾)

时间:2016-10-17 04:14:58

标签: regex perl bioinformatics

我需要perl中的正则表达式,它在开始时与ATG匹配,并以TAG,TAA或TGA结束。这是我到目前为止的代码。

my $sequence = 'AATGGTTTCTCCCATCTCTCCATCGGCATAAAAATACAGAATGATCTAACGAA';

while($sequence =~ ____) {
 print $1;
}

3 个答案:

答案 0 :(得分:5)

由于你在这里处理codons,你可能忘记提及它们之间的核苷酸必须是3的倍数。

<强>代码:

my $sequence = 'AATGGTTTCTCCCATCTCTCCATCGGCATAAAAATACAGAATGATCTAACGAA';
               # |--------------1-------------|
               #                                        |---2---|  

while($sequence =~ /ATG(?:[ACTG]{3})*?T(?:A[AG]|GA)/g)
{
    print $&."\n";
}

<强>输出:

ATGGTTTCTCCCATCTCTCCATCGGCATAA
ATGATCTAA

说明

  • ATG - 匹配&#34; ATG&#34;字面上
  • (?:[ACTG]{3})*? - 是non capturing group,重复0次,尽可能少(lazy quantifier,额外?),匹配:
    • [ACTG]{3} - 3个字符/核苷酸(&#34; A&#34;,&#34; C&#34;,&#34; T&#34;或&#34; G&#34; )
  • T(?:A[AG]|GA) - 匹配&#34; TAA&#34;,&#34; TAG&#34;或&#34; TGA&#34;。此外,如Borodin commented,如果您希望提高可读性,则可以将其写为(?:TAG|TAA|TGA)


但是,如果您还需要匹配重叠序列,则应使用lookahead来阻止匹配消费字符。

<强>代码:

               # modified to include overlapping sequences
my $sequence = 'AATGGTTTCTCCCATCTCTCCATCGGCATAAAAATATGGAATGATCTAACGAA';
               # |--------------1-------------|
               #                                   |---2---|
               #                                        |---3---|

while($sequence =~ /ATG(?=((?:[ACTG]{3})*?T(?:A[AG]|GA)))/g)
{
    print $&.$1."\n";
}

<强>输出:

ATGGTTTCTCCCATCTCTCCATCGGCATAA
ATGGAATGA
ATGATCTAA


最后,这是使用Unrolling the Loop技术的最后一个表达式的更高效版本,当您处理大型序列时,它将产生更好的结果。

<强>代码:

my $sequence = 'AATGGTTTCTCCCATCTCTCCATCGGCATAAAAATATGGAATGATCTAACGAA';
               # modified to include overlapping sequences

while($sequence =~ /ATG(?=((?:[ACG][ACTG]{2})*(?:T(?:A[CT]|G[CTG]|[CT][ACTG])(?:[ACG][ACTG]{2})*)*T(?:A[AG]|GA)))/g)
{
    print $&.$1."\n";
}

<强>输出:

ATGGTTTCTCCCATCTCTCCATCGGCATAA
ATGGAATGA
ATGATCTAA

答案 1 :(得分:1)

不确定这是否是您要找的,但是找到一个匹配,因此它不是详尽的

my $sequence = 'AATGGTTTCTCCCATCTCTCCATCGGCATAAAAATACAGAATGATCTAACGAA';

if($sequence =~ /(ATG.*?(:?TAG|TAA|TGA))/) {
 print $1;
}

<强>输出

ATGGTTTCTCCCATCTCTCCATCGGCATAA

答案 2 :(得分:1)

Try this:
#!/usr/bin/perl
my $sequence ='AATGGTTTCTCCCATCTCTCCATCGGCATAAAAATACAGAATGATCTAACGAA';
while($sequence =~m/ATG.*?(TGA|TAG|TAA)/g)
{
  print $&,"\n";
}