【问题标题】:How to match the same pattern in a string(one line) and perform the same action again如何匹配字符串(一行)中的相同模式并再次执行相同的操作
【发布时间】:2014-12-08 18:05:46
【问题描述】:

假设$dna = "aaaaccccttttaaaaggggaaaacccccaaaaggggaaaacccctttttttt"

我想在字符串中的每个 aaaa 和 cccc 之间切换 并换上新线。比如我想得到

aaaa
ccccttttaaaaggggaaaa
cccccaaaaggggaaaa
cccctttttttt

我的代码:

 if ($DNA =~ /(.*)$match(.*)/) { # $match would be aaaacccc together
               my $fragment1 = $1.$pre-match; # pre-match is aaaa
               my $fragment2 = $post-match.$2; # post-match is cccc
               print"$fragment1\n$fragment2\n";

我想在每场比赛中切入。

非常重要,只有在赛后才能切割 dna。必须有预赛

让我知道我做错了什么。谢谢

【问题讨论】:

    标签: regex perl bioinformatics


    【解决方案1】:

    这会做你想做的事:

    $dna = "aaaaccccttttaaaaggggaaaacccccaaaaggggaaaacccctttttttt";
    $dna =~ s/(.*?)(cccc.*?)/$1\n$2/g;
    
    print "$dna\n";
    

    正则表达式将在每个 cccc 之前添加一个换行符

    输出:

    aaaa
    ccccttttaaaaggggaaaa
    cccccaaaaggggaaaa
    cccctttttttt
    

    【讨论】:

    • 不客气!如果您觉得有用,请将答案标记为accepted
    • 我也建议将/r 标志作为非破坏性解决方案。 say $dna =~ s/(.+?)(cccc.+?)/$1\n$2/gr;,仅适用于较新的版本。
    【解决方案2】:

    一种解决方案是将字符串拆分并与"\n" 连接:

    use warnings;
    use strict;
    use 5.01;
    
    my $dna = "aaaaccccttttaaaaggggaaaacccccaaaaggggaaaacccctttttttt";
    my ($split_left, $split_right) = ('aaaa','cccc');
    
    say join "\n", split /(?<=$split_left)(?=$split_right)/, $dna;
    

    后匹配和预匹配是 perl 中的预定义术语,表示最后匹配之前和之后的整个字符串(您可以通过 ${^PREMATCH}${^POSTMATCH} 使用 /p 标志访问它们)。 perl 中的变量名也不能包含-,因为它是一个运算符,请改用_ 或camelCasing。

    【讨论】:

      【解决方案3】:

      我认为最简单的方法是添加换行符:

      $dna =~ s/aaaacccc/aaaa\ncccc/g;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-10
        • 2020-07-24
        • 1970-01-01
        • 1970-01-01
        • 2020-07-07
        • 2014-10-27
        相关资源
        最近更新 更多