2

この質問への回答に取り組んでいるときに、次の正規表現を思いつきました。

(?:(?!\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これはモジュールのバグですか?

4

1 に答える 1