擅长:python、mysql、java
<p>我相信,你的lookback不起作用的原因是因为你有<code>(?:green\s)?</code>,使“绿色”成为可选的。当扫描器到达'frog'时,它会向后看三个字符,寻找'no',但没有找到它,因此它接受'no green frogs seen'作为匹配。如果改为<code>(?:green\s)</code>,那么“green”不是可选的,那么这个测试用例将被拒绝。因此,与其使用负向后看,不如尝试负向前看:</p>
<pre><code>import re
test_cases = [
'frogs seen',
'green frog seen',
'no frogs seen',
'no green frogs seen',
'frogs not seen',
'green frogs not seen'
]
regex = re.compile(r'(?!no\s+)(?:(?:green\s+)?frogs?)(?=\s+seen)')
for test_case in test_cases:
if re.match(regex, test_case):
print(test_case)
</code></pre>
<p>印刷品:</p>
<pre><code>frogs seen
green frog seen
</code></pre>