如何在数据位置打印匹配的字符串?

时间:2015-01-27 05:06:29

标签: regex perl

我尝试在数据位置打印匹配的字符串,我该怎么办?

$at ="at";
@ar = <DATA>;
@xxv = map(m/$at/g, @ar);
print "@ar";
print @xxv;
print "\n";
__DATA__
atgacaagcagacccaggggatacgat

我预计输出

    atgacaagcagacccaggggatacgat
    at                  at   at

4 个答案:

答案 0 :(得分:6)

通过s///

获得所需的输出
$at ="at";
$ar = <DATA>;
print $ar;
$ar =~ s/$at(*SKIP)(*F)|./ /g;
print $ar;
__DATA__
atgacaagcagacccaggggatacgat

<强>输出:

atgacaagcagacccaggggatacgat
at                  at   at

$at(*SKIP)(*F)扩展变量$at,并将存储在变量中的同一组字符与输入字符串进行匹配。在(*SKIP)(*F)之后,匹配失败并强制|右侧的模式与剩余字符匹配。所以.匹配除跳过的字符以外的所有字符。用空格替换那些匹配的字符将为您提供所需的输出。

<强>参考文献:

答案 1 :(得分:1)

use warnings;
use strict;

my $at ="at";
my $ar ="atgacaagcagacccaggggatacgat";

(my $x = $ar) =~ s/./ /g;

substr($x, $-[0], $+[0]-$-[0]-1) = $at while $ar =~ /$at/g;

print "$ar\n$x\n";

根据您的评论,您似乎希望将结果打印到webbroser中。所以,当然,你需要一个非比例字体。要么你去

 print "<pre>";
 print "$ar\n";
 print "$x";
 print "</pre>";

或指定 monospace

 print "<div style='font-family:monospace'>");
 print "$ar<br>";
 print "$x";
 print "</div>";

答案 2 :(得分:0)

您可以将split与正则表达式一起使用,而不是map

$data = "atgacaagcagacccaggggatacgat" ;

my @chunks = split(/at/, $data) ;

print $data ; #echo input

#skip over non-matching chunks and print matches
foreach my $chunk (@chunks) {
    print ' ' x length($chunk) ;
    print 'at' ;
}

这将打印额外的&#39; at&#39;最后,但我懒得把它清理干净。

答案 3 :(得分:0)

@ user3384402以前的答案足以满足您的期望。

我认为您尝试对齐序列。在浏览器可视化中,空间不适合目标,这是你的问题。

只需简单,使用couriercourier new字体系列即可获得正确的视觉效果。生物信息学家在使用序列比对处理时仅使用这些字体。试试吧。