【问题标题】:How to highlight capture groups (e.g. with brackets around them) in the entire match output in Perl如何在 Perl 的整个匹配输出中突出显示捕获组(例如用括号括起来)
【发布时间】:2018-01-29 19:50:30
【问题描述】:

我有以下代码成功地将所有与我的正则表达式匹配的字符串打印到控制台 (perl myscript.pl sample_text.txt)。

$filename=shift;
open text, $filename or die "error opening $filename\n";

while (my $line = <text>) {
    push @matches, $1 while $line
        =~ m{
          (( [ACGT]{6} )
          CTGA
          [ACGT]
          GAG
          ( [ACGT]{3,6} )
          [ACGT]{2,100}
          (??{ $3 =~ tr/ACGT/TGCA/r })
          ( CGAAA[ACGT] ))
        }xgi;
}

print "$_\n" for @matches;

(这只是我的正则表达式的简化版本,我的捕获组要复杂得多,并且没有固定长度。)

我的sample_text可以下载here

我希望输出保持原样(每行一个匹配项),但我希望与 first ( [ACGT]{6} )last @ 匹配的子字符串987654326@ 在我的正则表达式中捕获组,以便在控制台中打印整个匹配时在它们周围加上括号。

举个例子,当我在附加的示例文件 (sample_text) 上运行上面的整个脚本时,我得到的匹配结果之一是:

TTTATGCTGATGAGAAAAAACATAAGAAAACGTATAATTTTTTCTAAAAAAGGAAAAAAGACCGAAATTTTAAGCTGTTTTTCGAAAA

我反而想看到这样的输出:

(TTTATG)CTGATGAGAAAAAACATAAGAAAACGTATAATTTTTTCTAAAAAAGGAAAAAAGACCGAAATTTTAAGCTGTTTTT(CGAAAA)

【问题讨论】:

  • 总是将$! variable添加到错误消息中以查看原因,... or die "... : $!\n";
  • 词法文件句柄更好,open my $fh, ....; while (my $line = &lt;$fh&gt;) { }

标签: regex perl capture-group


【解决方案1】:
push @matches, "($1)$2($4)"
    while
        $line =~ m{
            ( [ACGT]{6} )
            ( CTGA
              [ACGT]
              GAG
              ( [ACGT]{3,6} )
              [ACGT]{2,100}
              (??{ $3 =~ tr/ACGT/TGCA/r })
            )
            ( CGAAA [ACGT] )
        }xgi;

使用命名捕获:

#push @matches, sprintf "(%s)%s(%s)", @+{qw( pre main suf )}
push @matches, "($+{pre})$+{main}($+{suf})"
    while
        $line =~ m{
            (?<pre> [ACGT]{6} )
            (?<main> CTGA
              [ACGT]
              GAG
              ( [ACGT]{3,6} )
              [ACGT]{2,100}
              (??{ $^N =~ tr/ACGT/TGCA/r })
            )
            (?<suf> CGAAA [ACGT] )
        }xgi;

【讨论】:

    猜你喜欢
    • 2010-09-18
    • 2020-08-25
    • 2021-10-05
    • 2014-05-01
    • 2020-06-05
    • 2020-12-24
    • 2015-08-21
    • 2010-10-18
    • 1970-01-01
    相关资源
    最近更新 更多