我想找到ATG的所有事件...... TAG或ATG ...... TAA。我尝试过以下方法:
#!/usr/bin/perl
use warnings;
use strict;
my $file = ('ATGCCCCCCCCCCCCCTAGATGAAAAAAAAAATAAATGAAAAATAGATGCCCCCCCCCCCCCCC');
while($file =~ /((?=(ATG\w+?TAG|ATG\w+?TAA))/g){
print "$1\n";
}
给出 -
ATGCCCCCCCCCCCCCTAG
ATGAAAAAAAAAATAAATGAAAAATAG
ATGAAAAATAG
我想要 -
ATGCCCCCCCCCCCCCTAG
ATGAAAAAAAAAATAA
ATGAAAAATAG
我做错了什么?
答案 0 :(得分:1)
/(ATG\w+?TA[AG])/
有效,比FlyingFrog
提出的更优雅; - )
-bash-3.2$ perl
my $string = 'ATGCCCCCCCCCCCCCTAGATGAAAAAAAAAATAAATGAAAAATAGATGCCCCCCCCCCCCCCC';
my @matches = $string =~ /(ATG\w+?TA[AG])/g;
use Data::Dumper;
print Dumper \@matches;
$VAR1 = [
'ATGCCCCCCCCCCCCCTAG',
'ATGAAAAAAAAAATAA',
'ATGAAAAATAG'
];
答案 1 :(得分:1)
你实际上非常接近,从你上面的陈述中可以看出,你有两个捕获,当我认为你真的只想要一个;我也认为你不需要前瞻。
#!/usr/bin/perl
use warnings;
use strict;
my $file = ('ATGCCCCCCCCCCCCCTAGATGAAAAAAAAAATAAATGAAAAATAGATGCCCCCCCCCCCCCCC');
while($file =~ /(ATG\w+?TA[AG])/g){
print "$1\n";
}
# output
# ATGCCCCCCCCCCCCCTAG
# ATGAAAAAAAAAATAA
# ATGAAAAATAG
逐行:
ATG匹配文字 ATG
\ W +?可选地匹配一个或多个字符
TA [AG]匹配文字 TAA 或 TAG
答案 2 :(得分:0)
您的代码会找到以ATG
开头并以TAG
或TAA
结尾的序列 - 以先到者为准。如果您从序列中删除了所有TAG
,则会发现以TAA
结尾的延伸。通过制作两个捕获组(一个用于ATG...TAG
,一个用于ATG...TAA
),您将找到所有序列。
#!/usr/bin/perl
use warnings;
use strict;
my $file = ('ATGCCCCCCCCCCCCCTAGATGAAAAAAAAAATAAATGAAAAATAGATGCCCCCCCCCCCCCCC');
while($file =~ /(?=(ATG\w+?TAG))(?=(ATG\w+?TAA))/g){ # makes two capture groups
print "$1\n";
print "$2\n";
}
输出:
ATGCCCCCCCCCCCCCTAG
ATGCCCCCCCCCCCCCTAGATGAAAAAAAAAATAA
ATGAAAAAAAAAATAAATGAAAAATAG
ATGAAAAAAAAAATAA
----或者:----
#!/usr/bin/perl
use warnings;
use strict;
my $file = ('ATGCCCCCCCCCCCCCTAGATGAAAAAAAAAATAAATGAAAAATAGATGCCCCCCCCCCCCCCC');
while($file =~ /(?=(ATG\w+?TA[AG]))/g){
print "$1\n";
}
输出:
ATGCCCCCCCCCCCCCTAG
ATGAAAAAAAAAATAA
ATGAAAAATAG
取决于你究竟在追求什么...