找到这个和那个核苷酸序列的多个匹配

时间:2013-09-03 13:36:31

标签: regex perl bioinformatics

我想找到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

我做错了什么?

3 个答案:

答案 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开头并以TAGTAA结尾的序列 - 以先到者为准。如果您从序列中删除了所有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

取决于你究竟在追求什么...