Kyl*_*ise 1 regex perl bioinformatics
我需要perl中的正则表达式,它在开始时与ATG匹配,并以TAG,TAA或TGA结束.这是我到目前为止的代码.
my $sequence = 'AATGGTTTCTCCCATCTCTCCATCGGCATAAAAATACAGAATGATCTAACGAA';
while($sequence =~ ____) {
print $1;
}
Run Code Online (Sandbox Code Playgroud)
既然你在这里处理密码子,你可能忘了提到它们之间的核苷酸必须是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)