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

Perl regular expression (starts with ATG and ends with TAG, TAA, or TGA)

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

my $sequence = 'AATGGTTTCTCCCATCTCTCCATCGGCATAAAAATACAGAATGATCTAACGAA';

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

不确定这是否是您要查找的内容,但这会找到一个匹配项,因此它不是详尽无遗的

my $sequence = 'AATGGTTTCTCCCATCTCTCCATCGGCATAAAAATACAGAATGATCTAACGAA';

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

输出

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

既然你在这里处理codons,你可能忘了提到中间的核苷酸必须是3的倍数。

代码:

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

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

输出:

ATGGTTTCTCCCATCTCTCCATCGGCATAA
ATGATCTAA

描述:

  • ATG - 按字面意思匹配 "ATG"
  • (?:[ACTG]{3})*? - 是一个non capturing group, repeated 0 o more times, as few as possible (lazy quantifier,额外的?),匹配:
    • [ACTG]{3} - 3 characters/nucleotides("A"、"C"、"T" 或 "G")
  • T(?:A[AG]|GA) - 匹配 "TAA"、"TAG" 或 "TGA"。此外,如 Borodin ,如果您希望提高可读性,可以将其写为 (?:TAG|TAA|TGA)


但是如果你还需要匹配 overlapping 序列,你应该使用一个 lookahead 来防止匹配消耗字符。

代码:

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

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

输出:

ATGGTTTCTCCCATCTCTCCATCGGCATAA
ATGGAATGA
ATGATCTAA