我被困在构建带有重复限定符的正则表达式上。没有运气在网上找到一条建议。
这是一个要匹配的字符串 -
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}”限定符被忽略了。
如果我对正则表达式重复限定符的理解是错误的,有人可以发表评论吗?
任何人都可以建议一个工具来可视化正则表达式如何逐步解释吗?
谢谢
最佳答案
您已在正则表达式中包含 {2}
,但尚未将其包含在匹配组中。这意味着在计算是否存在匹配时会评估重复条件,但在计算促成匹配的组时不会评估重复条件。相反,您会得到匹配两次的组的一次重复。要将两个重复项分配给一组内容,请在该组的 ()
中包含 {2}
。
请注意,分配的组数永远不会多于输入中的文字对()
。要获得组中的各个重复项,您必须编写一个循环并重复匹配(或者在 Perl 中,通过其 e
标志在正则表达式中包含代码)。
关于python - 正则表达式中重复限定符被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24906723/