【问题标题】:Perl regular expression for a repetitive sentence用于重复句子的 Perl 正则表达式
【发布时间】:2014-03-16 23:29:32
【问题描述】:

我正在寻找与重复模式匹配的正则表达式。

例如

The great eagle flied high flied high.  

重复:flied high

The call was done at night was done at night.  

重复:was done at night

有没有办法做到这一点?我只想要正则表达式,以便我可以使用grep -P 过滤一些文件。

Found 5 files under folders: home folder, home folder, home folder, home folder, home folder  

重复:home folder

The query returned this preferences for this user: color black, fried chicken, color black, fried chicken, white shirt, brown color

重复:color black,

本质上,我想做的是找到“重复的句子”来匹配”。

【问题讨论】:

  • 你有没有努力为自己解决这个问题? Stack Overflow 是程序员在遇到问题时可以向同时代人寻求帮助的地方。它并不打算用作免费编程工作的来源。

标签: perl pcre


【解决方案1】:

你没有很好地定义你的问题。就目前而言,你可以写

my $s = 'The great eagle flied high flied high.';
print qq{"$1"\n} if $s =~ /(.+)\1/;

输出

" flied high"

但是,如果你应用你的第二个字符串

my $s = 'The call was done at night was done at night.';
print qq{"$1"\n} if $s =~ /(.+)\1/;

输出

"l"

因此,解决方案取决于您拥有的数据集。如果您可以更严格地定义您的问题,那么我们可以为您提供更好的帮助。

【讨论】:

    【解决方案2】:

    是的,只需在正则表达式中使用\1 来指示重复匹配的模式。我故意将此正则表达式限制为仅匹配 2-4 个单词的短语,以限制它的工作难度:

    #!usr/bin/perl
    
    use strict;
    use warnings;
    
    while (<DATA>) {
        if (my @phrases = /\b(\S+(?:\s+\S+){1,3})\s+\1/g) {
            print "$_\n" for @phrases;
        }
    }
    
    __DATA__
    The great eagle flied high flied high.
    The call was done at night was done at night.
    

    输出

    flied high
    was done at night
    

    【讨论】:

    • 匹配任何超过4个单词的词组,会怎样?
    • {1,3} 的使用表示在第一个单词之后还有 1-3 个单词。如果你想增加计数,你可以在那里。我建议您设置一些上限,即使它是任意上限。或者如果你真的不想要一个上限,你可以使用+,它表示一个或多个。
    • 是的。我认为加号正是我所需要的。谢谢:)
    • 这没有解决 OP 的第二个示例,其中仅在中间文本之后重复该短语。在编写任何代码之前,需要更准确地定义问题。
    • @Borodin 实际上,鉴于他的问题的性质与如何搜索重复表达式有关,答案最终是反向引用\1,无论具体的实现细节或修订规范如何。我同意,如果他提前为他的问题付出更多努力,他将从这些论坛中获得更多好处,但我会说我展示了适当的努力水平以换取他的展示。
    猜你喜欢
    • 2014-03-24
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 2014-11-02
    • 2018-05-05
    相关资源
    最近更新 更多