仅在特定位置匹配表达式

通常,你希望仅在特定位置匹配表达式 (在其他位置保持不变,即)。请考虑以下句子:

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) 的位置。