Python3正則表達(dá)式之:(?(id/name)yes-pattern|no-pattern)條件性匹配
1. 用途
(?(id/name)yes-pattern|no-pattern)的作用是:
對(duì)于給出的
id或者name,先嘗試去匹配yes-pattern部分的內(nèi)容;如果
id或name條件不滿(mǎn)足,則去匹配no-pattern部分的內(nèi)容;
這句話(huà)聽(tīng)著還是很拗口的,或者說(shuō)一下子還是很難懂的。
2. 參數(shù)含義
此處的name或id,是針對(duì)(當(dāng)前位置的)條件性匹配之前的,某個(gè)已經(jīng)通過(guò)group去分組的內(nèi)容
name: 如果是有命名的分組,即named group,則對(duì)應(yīng)的該分組就有對(duì)應(yīng)的name,即此處所指的就是對(duì)應(yīng)的name;
id: 如果是無(wú)命名的分組,即unnamed group,則對(duì)應(yīng)的該分組也有對(duì)應(yīng)的分組的編號(hào),稱(chēng)為group的number,也叫做id,對(duì)應(yīng)的就是這里的id;
yes-pattern: 如果前面的group匹配成功,則此處,就執(zhí)行yes-pattern的匹配;
no-pattern: 如果前面group匹配不成功,即沒(méi)有找到符合該的group內(nèi)容,則就匹配no-pattern;
注意: 上面的yes-pattern和no-pattern,都是普通的正則表達(dá)式,用來(lái)匹配所需的內(nèi)容。
3. 語(yǔ)法
如果存在no-pattern,則前面要有個(gè)豎杠'|',用來(lái)分隔yes-pattern和no-pattern
如果不想匹配no-pattern的部分,則可以連同'|'一起不寫(xiě)。
實(shí)例:
>>> re.search(r'(\d+)?(?(1)\w+|jb51\.\w+)', 'jb51.com')>>> re.search(r'(\d+)?(?(1)\w+)', '100jb51')
其中的?(1)代表序號(hào)為1的group, 也就是上面(\d+), 第二個(gè)表達(dá)式中就沒(méi)有使用no-pattern
4. 用法詳解
還是上面的例子, 我們變換一下, 用實(shí)例探索它們的詳細(xì)用法及技巧
4.1 把(\d+)后面的問(wèn)號(hào)去掉, 也就是說(shuō)必須存在group 1,不是可有可無(wú)
執(zhí)行:
>>> re.search(r'(\d+)(?(1)\w+|jb51\.\w+)', 'jb51.com') >>>
整體規(guī)則匹配失敗,返回為空,no-pattern部分并沒(méi)有按照預(yù)想執(zhí)行。
4.2 改一下匹配字符串
>>> re.search(r'(\d+)(?(1)\w+|jb51\.\w+)', '1jb51.com')
可以匹配到, group1和yes部分都匹配到了
4.3 group可有可無(wú)的情況(group后增加問(wèn)號(hào))
>>> re.search(r'(\d+)?(?(1)\w+|jb51\.\w+)', 'jb51') >>>
如果group沒(méi)有匹配到,且它可有可無(wú), 那么group會(huì)被認(rèn)為匹配不成功,繼續(xù)執(zhí)行no-pattern部分匹配
4.4 只匹配group 1 部分, yes部分沒(méi)有匹配
>>> re.search(r'(\d+)(?(1)\w+|jb51\.\w+)', '1000')
只匹配group 1 部分, yes部分沒(méi)有匹配,也是有匹配結(jié)果的, 那說(shuō)明yes-pattern和no-pattern不一定必須匹配成功
5.結(jié)論
1. 通過(guò)4.1 4.2 4.3 對(duì)比可以發(fā)現(xiàn):
當(dāng)該特殊規(guī)則中的作為判斷條件的組本身不允許為空的時(shí)候,在該組對(duì)目標(biāo)字符串匹配為空的情況下,整體規(guī)則匹配失敗,所以后面的作為整體一部分的特殊規(guī)則自然也就無(wú)效了。所以要想特殊規(guī)則的no-pattern生效,必須判斷條件對(duì)應(yīng)組匹配數(shù)可以為0。
2. 通過(guò)4.4可知:可以?xún)H匹配group部分, 如果yes-pattern和no-pattern沒(méi)有匹配到, 則會(huì)僅輸出group匹配的內(nèi)容
更多關(guān)于Python3正則表達(dá)式的相關(guān)教程請(qǐng)查看下面的相關(guān)鏈接
相關(guān)文章
LyScript實(shí)現(xiàn)Hook隱藏調(diào)試器的方法詳解
LyScript?插件集成的內(nèi)置API函數(shù)可靈活的實(shí)現(xiàn)繞過(guò)各類(lèi)反調(diào)試保護(hù)機(jī)制。本文將運(yùn)用LyScript實(shí)現(xiàn)繞過(guò)大多數(shù)通用調(diào)試機(jī)制,實(shí)現(xiàn)隱藏調(diào)試器的目的,需要的可以參考一下2022-09-09
numba提升python運(yùn)行速度的實(shí)例方法
在本篇文章里小編給大家整理的是一篇關(guān)于numba提升python運(yùn)行速度的實(shí)例方法,有興趣的朋友們可以參考下。2021-01-01
自然語(yǔ)言處理NLP TextRNN實(shí)現(xiàn)情感分類(lèi)
這篇文章主要為大家介紹了自然語(yǔ)言處理NLP TextRNN實(shí)現(xiàn)情感分類(lèi)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
使用python PIL庫(kù)批量對(duì)圖片添加水印的過(guò)程詳解
平常我們想給某些圖片添加文字水印,方法有很多,也有很多的工具可以方便的進(jìn)行,今天主要是對(duì)PIL庫(kù)的應(yīng)用,結(jié)合Python語(yǔ)言批量對(duì)圖片添加水印,文章通過(guò)代碼示例給大家介紹的非常詳細(xì),感興趣的同學(xué)可以參考一下2023-11-11
關(guān)于Pycharm配置翻譯插件Translation報(bào)錯(cuò)更新TTK失敗不能使用的問(wèn)題
這篇文章主要介紹了關(guān)于Pycharm配置翻譯插件Translation報(bào)錯(cuò)更新TTK失敗不能使用的問(wèn)題,本文通過(guò)圖文并茂的形式給大家分享解決方案,需要的朋友可以參考下2022-04-04
如何實(shí)現(xiàn)一個(gè)python函數(shù)裝飾器(Decorator)
這篇文章主要介紹了如何實(shí)現(xiàn)一個(gè)python函數(shù)裝飾器(Decorator),幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下2020-10-10
Python Requests爬蟲(chóng)之求取關(guān)鍵詞頁(yè)面詳解
這篇文章主要為大家詳細(xì)介紹了Python Requests爬蟲(chóng)之求取關(guān)鍵詞頁(yè)面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02
Python中條件語(yǔ)句、循環(huán)語(yǔ)句和pass語(yǔ)句的使用示例
Python條件語(yǔ)句是通過(guò)一條或多條語(yǔ)句的執(zhí)行結(jié)果(True或者False)來(lái)決定執(zhí)行的代碼塊,下面這篇文章主要給大家介紹了關(guān)于Python中條件語(yǔ)句、循環(huán)語(yǔ)句和pass語(yǔ)句使用的相關(guān)資料,需要的朋友可以參考下2022-06-06

