1. 程式人生 > >python re模塊findall使用

python re模塊findall使用

asdfasd 展現 VG mas dal class pro 相對 test

今天練習re模塊時候出現了一個很奇怪的問題,同樣的正則表達式用re.search()與用re.compile().findall()匹配出來的結果不一致。

很是奇怪,故此記錄一下,防止以後碰到類似情況解決不了。

1 #!/usr/bin/env python3
2 # Author:taoke
3 import re
4 str = <link rel="icon" sizes="any" mask href="http://www.baidu.com/img/baidu_85beaf5496f291521eb75ba38eacbd87.svg.com">
5 pat = [a-zA-Z0-9]+://[a-zA-Z0-9]+\.[a-zA-Z0-9]+\.(com|cn)
6 p = re.search(pat,str) 7 print(p) 8 p = re.compile(pat).findall(str) 9 print(len(p) , p)

運行結果:

1 D:\Code\WebCrawler\venv\Scripts\python.exe D:/Code/WebCrawler/reTest/reTest1.py
2 <_sre.SRE_Match object; span=(40, 60), match=http://www.baidu.com>
3 1 [com]
4 
5 Process finished with exit code 0

兩次結果並不一致。隨後到處查資料問人,後來發現一篇博客:python re 模塊 findall 函數用法簡述

介紹了re.re.compile().findall()的用法。

>>> import re  
>>> s = "adfad asdfasdf asdfas asdfawef asd adsfas "  
  
>>> reObj1 = re.compile(((\w+)\s+\w+))  
>>> reObj1.findall(s)  
[(adfad asdfasdf, adfad), (
asdfas asdfawef, asdfas), (asd adsfas, asd)] >>> reObj2 = re.compile((\w+)\s+\w+) >>> reObj2.findall(s) [adfad, asdfas, asd] >>> reObj3 = re.compile(\w+\s+\w+) >>> reObj3.findall(s) [adfad asdfasdf, asdfas asdfawef, asd adsfas]

按以上代碼例子講解:

findall函數返回的總是正則表達式在字符串中所有匹配結果的列表,此處主要討論列表中“結果”的展現方式,即findall中返回列表中每個元素包含的信息。

@1.當給出的正則表達式中帶有多個括號時,列表的元素為多個字符串組成的tuple,tuple中字符串個數與括號對數相同,字符串內容與每個括號內的正則表達式相對應,並且排放順序是按括號出現的順序。

@2.當給出的正則表達式中帶有一個括號時,列表的元素為字符串,此字符串的內容與括號中的正則表達式相對應(不是整個正則表達式的匹配內容)。

@3.當給出的正則表達式中不帶括號時,列表的元素為字符串,此字符串為整個正則表達式匹配的內容。

所以將我上面的正則表達式該後如下:

1 #!/usr/bin/env python3
2 # Author:taoke
3 import re
4 str = <link rel="icon" sizes="any" mask href="http://www.baidu.com/img/baidu_85beaf5496f291521eb75ba38eacbd87.svg.com">
5 pat = [a-zA-Z0-9]+://[a-zA-Z0-9]+\.[a-zA-Z0-9]+\.com|cn
6 p = re.search(pat,str)
7 print(p)
8 p = re.compile(pat).findall(str)
9 print(len(p) , p)

運行結果如下:

1 D:\Code\WebCrawler\venv\Scripts\python.exe D:/Code/WebCrawler/reTest/reTest1.py
2 <_sre.SRE_Match object; span=(40, 60), match=http://www.baidu.com>
3 1 [http://www.baidu.com]
4 
5 Process finished with exit code 0

兩次匹配的結果一致了,哈哈。

python re模塊findall使用