正则表达式中忽略重复限定符

时间:2014-07-23 09:26:03

标签: python regex perl

我因重复限定符而无法构建正则表达式。没有运气在网上找到一条建议。

这是一个匹配的字符串 -

abc cde fgi

正则表达式是

^(?:(.*?)(abc|fgi)){2}(.*)$

以下是redemo.py的示例输出:

the way how the regex matches the string

我从Perl得到的类似输出:

perl --version | head -2; perl -MData::Dumper -e 'print Dumper ["abc cde fgi" =~ /^(?:(.*?)(abc|fgi)){2}(.*)$/g]'

This is perl 5, version 14, subversion 4 (v5.14.4) built for cygwin-thread-multi
$VAR1 = [
          ' cde ',
          'fgi',
          ''
        ];

我最好留下范围的原因,为什么我必须正确应用这个正则表达式。

但问题是:我希望'{2}'限定符是一个严格的要求来匹配字符串,因此解释器将返回5组成功匹配 -

1: ''
2: 'abc'
3: ' '
4: 'fgi'
5: ''

出乎意料的是,解释器只返回3组很好,看起来“{2}”限定符被忽略了。

如果我对正则表达式重复限定词的理解错误,有人会发表评论吗?

任何人都可以建议一个工具来逐步解释正则表达式的解释吗?

谢谢,

1 个答案:

答案 0 :(得分:1)

您的正则表达式中包含{2},但尚未将其包含在匹配组中。这意味着在计算是否存在匹配时评估重复条件,但在计算导致匹配的组时不评估重复条件。相反,你得到匹配两次的组的一次重复。要将重复分配给一个组的内容,请在{2}中为该组添加()

请注意,从不获得的分组数量多于输入中的文字()对。要获得组的单独重复,您必须编写循环并重复匹配(或者在Perl中,通过其e标志在正则表达式中包含代码)。