如何使perl在搜索和替换期间跳过某些单词

时间:2015-06-16 10:57:53

标签: regex perl

如果文件中的单词与某些关键字/名称匹配,我正在尝试进行HTML突出显示。然而,有时关键词的一部分也存在,Perl再次匹配它。

例如我有以下关键词

  1. KY SPINE & REHAB - 找到后用方括号替换
  2. SPINE - 找到时用圆括号替换
  3. REHAB - 找到时用圆括号替换
  4. KY SPINE & REHAB匹配后,我想阻止它与SPINEREHAB匹配。

    这就是我现在所得到的。我不能给HTML示例,因为我不知道如何显示HTML标签,因为这个网站翻译它只显示文本。实际上,我试图根据它们来自哪个集合来突出显示不同颜色的这些关键字。

    我现在得到的是什么:

    [KY (SPINE) & (REHAB)]
    

    我想要的是:

    [KY SPINE & REHAB]
    

    如何在搜索和替换时让Perl跳过单词?

    我有数百万条记录,我必须这样做,即使并行处理也不是那么快。因此,我们将非常感谢代码高效的建议。

    作为更新,我有数百个关键字,任何关键字都可以是另一个关键字的子集。所以硬编码就不实用了。我正在寻找解决方案,其中perl可以跳过括在方括号内的字符串,这样就不会发生进一步的替换。

3 个答案:

答案 0 :(得分:1)

如果这些是您想要突出显示的唯一三个短语,那么这将为您完成

perl -i -pe's/(KY SPINE & REHAB|SPINE|REHAB)/$1 =~ tr/&// ? "[$1]" : "($1)"/eg' myfile

答案 1 :(得分:0)

怎么样:

while(<DATA>) {
    chomp;
    s/(KY SPINE & REHAB)/[$1]/;
    s/(SPINE(?!.*REHAB)|(?<!SPINE & )REHAB)/($1)/;
    say;
}

__DATA__
KY SPINE & REHAB - when found replace with square brackets around it
SPINE - when found replace with round brackets around it
REHAB - when found replace with round brackets around it

<强>输出:

[KY SPINE & REHAB] - when found replace with square brackets around it
(SPINE) - when found replace with round brackets around it
(REHAB) - when found replace with round brackets around it

答案 2 :(得分:-1)

这对我有用

s/(KY SPINE & REHAB|SPINE|REHAB)/[$1]/g

希望它对您有用

修改

这是一个适合我的完整代码。可以将它用于您的案例或任何其他自定义替换任何字符串。这可能不是一个很酷的衬垫,但它的工作原理。希望它更适合您的需求。

use strict;
use warnings;

my ($new, $last, $offset, $length, $replace);

while(<DATA>) {
    $new = '';
    $last = 0;
    while ($_ =~ m/KY SPINE & REHAB|SPINE|REHAB/g) {
        $offset = $-[0];
        if ($& eq 'KY SPINE & REHAB') {
            $replace = '[' . $& . ']';
        }
        if ($& eq 'SPINE') {
            $replace = '(' . $& . ')';
        }
        if ($& eq 'REHAB') {
            $replace = '(' . $& . ')';
        }
        $length = $offset - $last;
        $new .= substr($_, $last, $length) . $replace;
        $last = $+[0];
    }
    $length = length($_) - $last;
    $new .= substr($_, $last, $length);
    print $new;
}

__DATA__
lorem ipsum KY SPINE & REHAB dolor sit amet SPINE consectetur adipiscing elit REHAB sed do eiusmod tempor incididunt ut labore et dolore magna aliqua  sit amet SPINE consectetur adipiscing elit REHAB sed do eiusmod tempor
 KY SPINE & REHAB dolor sit amet SPINE consectetur adipiscing elit REHAB sed do eiusmod tempor incididunt ut amet SPINE consectetur adipiscing elit REHAB sed do eiusmod tempor adipiscing elit REHAB sed do eiusmod tempor
lorem ipsum KY SPINE & REHAB dolor sit amet SPINE consectetur adipiscing elit REHAB sed do eiusmod tempor incididunt ut labore et dolore magna aliqua  sit amet SPINE consectetur adipiscing elit REHAB sed do eiusmod tempor
SPINE sit amet SPINE consectetur REHAB
SPINE
sit amet SPINE consectetur KY SPINE & REHAB REHAB