僅在特定位置匹配表示式
通常,你希望僅在特定位置匹配表示式 (在其他位置保持不變,即)。請考慮以下句子:
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)
的位置。