【问题标题】:Find multiple matches of this and that nucleotide sequence找到这个和那个核苷酸序列的多个匹配项
【发布时间】:2013-09-03 22:12:05
【问题描述】:

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

我做错了什么?

【问题讨论】:

  • 您是在寻找其中之一,还是两者兼而有之?

标签: regex perl bioinformatics


【解决方案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] 匹配文字 TAATAG

【讨论】:

    【解决方案2】:

    /(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'
            ];
    

    【讨论】:

      【解决方案3】:

      您的代码将找到以ATG 开头并以TAGTAA 结尾的序列 - 以先到者为准。如果您从序列中删除所有TAGs,您会发现以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
      

      取决于你到底在追求什么......

      【讨论】:

      • 第二个做我想做的事
      猜你喜欢
      • 2023-02-19
      • 1970-01-01
      • 2021-07-06
      • 1970-01-01
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      • 2020-05-01
      • 2014-03-07
      相关资源
      最近更新 更多