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

Python 在正则表达式中忽略重复限定符,python,regex,perl,Python,Regex,Perl,我一直在用重复限定符构建正则表达式。没有运气在网上找到一条建议 这里有一个字符串要匹配- abc cde fgi 正则表达式是 ^(?:(.*?)(abc|fgi)){2}(.*)$ 以下是redemo.py的输出示例: 我从Perl中得到了一个类似的输出: perl --version | head -2; perl -MData::Dumper -e 'print Dumper ["abc cde fgi" =~ /^(?:(.*?)(abc|fgi)){2}(.*)$/g]' Th

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

这里有一个字符串要匹配-

abc cde fgi
正则表达式是

^(?:(.*?)(abc|fgi)){2}(.*)$
以下是redemo.py的输出示例:

我从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}”限定符被忽略了

如果我对regex重复限定符的理解是错误的,有人能评论一下吗

有人能建议一个工具来可视化如何一步一步地解释正则表达式吗


谢谢,

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


请注意,分配给您的组永远不会超过输入中的文本对
()
。要获得组的单个重复,您必须编写循环并重复匹配(或者在Perl中,通过其
e
标志将代码包含在正则表达式中)。

我理解您关于创建循环的评论,我必须这样做。但是你能解释一下你所说的“为了获得分配给一个组的内容的两个重复,在该组的()中包含{2}”是什么意思吗?举个例子吧?如果你匹配
([0-9]){3}
,那么如果有一个三位数,你就会匹配,但是返回值将仅是其中的一位(可能是最后一位)。如果匹配
([0-9]{3})
,则返回值将是整个三位数。