仅在特定位置匹配表达式
通常,你希望仅在特定位置匹配表达式 (在其他位置保持不变,即)。请考虑以下句子:
An apple a day keeps the doctor away (I eat an apple everyday).
这里苹果出现两次,可以通过所谓的回溯控制动词来解决,这些动词由较新的 regex
模块支持。这个想法是:
forget_this | or this | and this as well | (but keep this)
以我们的苹果为例,这将是:
import regex as re
string = "An apple a day keeps the doctor away (I eat an apple everyday)."
rx = re.compile(r'''
\([^()]*\) (*SKIP)(*FAIL) # match anything in parentheses and "throw it away"
| # or
apple # match an apple
''', re.VERBOSE)
apples = rx.findall(string)
print(apples)
# only one
只有当它可以在括号外找到时才匹配 apple
。
以下是它的工作原理:
- 虽然从寻找左到右,正则表达式引擎消耗一切的左边,
(*SKIP)
作为一个永远真断言。之后,它在(*FAIL)
和回溯中正确失败。 - 现在它从右到左 (也就是回溯时) 到达
(*SKIP)
点,禁止向左前进。相反,引擎被告知扔掉左边的任何东西并跳转到调用(*SKIP)
的位置。