1. 程式人生 > >Python中正則匹配使用findall,捕獲分組(xxx)和非捕獲分組(?:xxx)的差異

Python中正則匹配使用findall,捕獲分組(xxx)和非捕獲分組(?:xxx)的差異

bbb tps img 是把 區別 內容 是我 解答 什麽是

轉自:https://blog.csdn.net/qq_42739440/article/details/81117919

下面是我在用findall匹配字符串時遇到的一個坑,分享出來供大家跳坑。

例題:

技術分享圖片

如圖所示: 正則a和正則b兩個式子匹配出來的結果是不同的。

?: 的作用就是把捕獲分組轉變為非捕獲分組。

技術分享圖片

什麽是捕獲組和非捕獲組呢?

(qq|163|126) ---> 這樣單獨的括號就為捕獲組

(?:qq|163|126) ---> 這樣在原有分組裏加上?: 就把捕獲組轉變為一個非捕獲組

findall函數的源碼解析

在這裏面大家可以看一下findall函數的源碼解析,用help(re.findall)

查看,得到如下翻譯:

技術分享圖片

技術分享圖片

白話理解:

findall函數,就是說在正則匹配裏,如果有分組,就僅僅匹配分組裏面的內容,然後返回這個組的列表; 如果有多個分組,那就把每一個分組看成一個單位,組合為一個元組,然後返回一個含有多個元組的列表。

技術分享圖片

例題解答:

區別了捕獲組和非捕獲組後,上面開頭例題中匹配郵箱的問題就迎刃而解了。

正則a的式子:r"\w+@(qq|163|126).com" 是匹配了捕獲組,所以得到了[‘qq‘, ‘163‘, ‘126‘] 這個列表;

正則b的式子: r"\w+@(?:qq|163|126).com" ,?: 把捕獲組轉變為一個非捕獲組,使得這個式子可以從頭到尾全部匹配,所以成功得到了 [‘[email protected]‘, ‘[email protected]‘, ‘[email protected]‘] 這個郵箱列表。

Python中正則匹配使用findall,捕獲分組(xxx)和非捕獲分組(?:xxx)的差異