Python中正則匹配使用findall,捕獲分組(xxx)和非捕獲分組(?:xxx)的差異
阿新 • • 發佈:2018-08-29
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)的差異