Python3正規表示式之:(?(id/name)yes-pattern|no-pattern)條件性匹配

pythontab發表於2019-07-19

Python3正規表示式之:(?(id/name)yes-pattern|no-pattern)條件性匹配

1. 用途

(?(id/name)yes-pattern|no-pattern) 的作用是:

對於給出的id或者name,先嚐試去匹配 yes-pattern部分的內容;

如果idname條件不滿足,則去匹配no-pattern部分的內容;

這句話聽著還是很拗口的,或者說一下子還是很難懂的。

2. 引數含義

此處的name或id,是針對(當前位置的)條件性匹配之前的,某個已經透過group去分組的內容

name: 如果是有命名的分組,即named group,則對應的該分組就有對應的name,即此處所指的就是對應的name;

id: 如果是無命名的分組,即unnamed group,則對應的該分組也有對應的分組的編號,稱為group的number,也叫做id,對應的就是這裡的id;

yes-pattern: 如果前面的group匹配成功,則此處,就執行yes-pattern的匹配;

no-pattern: 如果前面group匹配不成功,即沒有找到符合該的group內容,則就匹配no-pattern;

注意: 上面的yes-patternno-pattern,都是普通的正規表示式,用來匹配所需的內容。

3. 語法

如果存在no-pattern,則前面要有個豎槓’|’,用來分隔yes-patternno-pattern

如果不想匹配no-pattern的部分,則可以連同'|'一起不寫。

例項:

>>> re.search(r'(\d+)?(?(1)\w+|pythontab\.\w+)', 'pythontab.com')>>> re.search(r'(\d+)?(?(1)\w+)', '100pythontab')


其中的?(1)代表序號為1的group, 也就是上面(\d+), 第二個表示式中就沒有使用no-pattern

4. 用法詳解

還是上面的例子, 我們變換一下, 用例項探索它們的詳細用法及技巧


4.1 把(\d+)後面的問號去掉, 也就是說必須存在group 1,不是可有可無

執行:

>>> re.search(r'(\d+)(?(1)\w+|pythontab\.\w+)', 'pythontab.com')
>>>

整體規則匹配失敗,返回為空,no-pattern部分並沒有按照預想執行。


4.2 改一下匹配字串

>>> re.search(r'(\d+)(?(1)\w+|pythontab\.\w+)', '1pythontab.com')

可以匹配到, group1和yes部分都匹配到了


4.3 group可有可無的情況(group後增加問號)

>>> re.search(r'(\d+)?(?(1)\w+|pythontab\.\w+)', 'pythontab')
>>>

如果group沒有匹配到,且它可有可無, 那麼group會被認為匹配不成功,繼續執行no-pattern部分匹配


4.4 只匹配group 1 部分, yes部分沒有匹配

>>> re.search(r'(\d+)(?(1)\w+|pythontab\.\w+)', '1000')

只匹配group 1 部分, yes部分沒有匹配,也是有匹配結果的, 那說明yes-pattern和no-pattern不一定必須匹配成功

5.結論

1. 透過4.1 4.2 4.3 對比可以發現:

當該特殊規則中的作為判斷條件的組本身不允許為空的時候,在該組對目標字串匹配為空的情況下,整體規則匹配失敗,所以後面的作為整體一部分的特殊規則自然也就無效了。所以要想特殊規則的no-pattern生效,必須判斷條件對應組匹配數可以為0。

2. 透過4.4可知:可以僅匹配group部分, 如果yes-patternno-pattern沒有匹配到, 則會僅輸出group匹配的內容


相關文章