在回答这个问题时,我想出了这个正则表达式:
(?:(?!\2)(?:,foo=([^,]*),(?=())|.))*\2bar=2
(注意:这个正则表达式需要PyPIregex
模块)
(简短的解释:正则表达式依赖于这样一个事实,即前瞻中的捕获组在匹配一次后无法更改其值,因此在foo=
找到第一个后,(?=())
匹配以及从那时起(?!\2)
将始终失败。)
此正则表达式适用于问题中给出的 2 个示例:
>>> pattern = r'(?:(?!\2)(?:,foo=([^,]*),(?=())|.))*\2bar=2'
>>> regex.match(pattern, 'baz=0,foo=1,bar=2,foo=3,bar=4').group(1)
'1'
>>> regex.match(pattern, 'baz=0,foo=1,foo=1,bar=2')
>>>
但是如果出现foo=
after a ,就会发生一些奇怪的事情bar=2
:
>>> # this doesn't match, as expected:
>>> regex.match(pattern, 'notfoo=1,bar=2')
>>> # but how the heck does it match this ?!
>>> regex.match(pattern, 'notfoo=1,bar=2,foo=3,')
<regex.Match object; span=(0, 14), match='notfoo=1,bar=2'>
如您所见,字符串'notfoo=1,bar=2,foo=3,'
产生了notfoo=1,bar=2
. 甚至不包含在匹配中,但是如果将foo=3,
其删除,则正则表达式将不再匹配!这怎么可能?这是regex
模块中的错误吗?