python re模塊findall使用
阿新 • • 發佈:2018-03-18
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使用