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

Kyl*_*ise 1 regex perl bioinformatics

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

my $sequence = 'AATGGTTTCTCCCATCTCTCCATCGGCATAAAAATACAGAATGATCTAACGAA';

while($sequence =~ ____) {
 print $1;
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ano 5

既然你在这里处理密码子,你可能忘了提到它们之间的核苷酸必须是3的倍数.

码:

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

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

输出:

ATGGTTTCTCCCATCTCTCCATCGGCATAA
ATGATCTAA
Run Code Online (Sandbox Code Playgroud)

描述:

  • ATG - 字面上匹配"ATG"
  • (?:[ACTG]{3})*?- 是一个非捕获组,重复0次以上,尽可能少(懒惰量词,额外?),匹配:
    • [ACTG]{3} - 3个字符/核苷酸("A","C","T"或"G")
  • T(?:A[AG]|GA) - 匹配"TAA","TAG"或"TGA".此外,正如Borodin所 评论的那样,这可以写成(?:TAG|TAA|TGA)好像您希望提高可读性.


但是,如果您还需要匹配重叠序列,则应使用前瞻以防止匹配消耗字符.

码:

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

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

输出:

ATGGTTTCTCCCATCTCTCCATCGGCATAA
ATGGAATGA
ATGATCTAA
Run Code Online (Sandbox Code Playgroud)


最后,这是使用展开循环技术的最后一个表达式的更高效版本,当您处理大型序列时,这将产生更好的结果.

码:

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";
}
Run Code Online (Sandbox Code Playgroud)

输出:

ATGGTTTCTCCCATCTCTCCATCGGCATAA
ATGGAATGA
ATGATCTAA
Run Code Online (Sandbox Code Playgroud)