我需要perl中的正则表达式,它在开始时与ATG匹配,并以TAG,TAA或TGA结束。这是我到目前为止的代码。
my $sequence = 'AATGGTTTCTCCCATCTCTCCATCGGCATAAAAATACAGAATGATCTAACGAA';
while($sequence =~ ____) {
print $1;
}
答案 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";
}