Python正則表達式re.compile()和re.findall()詳解
前言
在使用爬蟲提取網(wǎng)頁中的部分信息時,采用到了re.compile()與re.findall()兩種方法,目的:把網(wǎng)頁中的“某某城市土地規(guī)劃表”截取并打印出來.
網(wǎng)頁中的代碼:
<span class='tab-details'>某某城市土地規(guī)劃表</span>
提取的方法:
def parse_response(html): pattern = re.compile('class=\'tab-details\'>(.*?)</span>',re.S) items = re.findall(pattern,html) print(items) return items
結(jié)果:
['某某城市土地規(guī)劃表']
這里主要講解pattern,re.compile()與re.findall()的定義及用法:
1.pattern :pattern 屬性規(guī)定用于驗證輸入字段的正則表達式。
2.re.compile():compile() 方法用于在腳本執(zhí)行過程中編譯正則表達式,也可用于改變和重新編譯正則表達式。
舉例:在字符串中全局搜索 "man",并用 "person" 替換。然后通過 compile() 方法,改變正則表達式,用 "person" 替換 "man" 或 "woman",:
<script type="text/javascript"> var str="Every man in the world! Every woman on earth!"; patt=/man/g; str2=str.replace(patt,"person"); //用person取代man document.write(str2+"<br />"); patt=/(wo)?man/g; patt.compile(patt); str2=str.replace(patt,"person"); //用person取代man或者woman document.write(str2); </script>
輸出:(可見第一行中的man都被person取代,出現(xiàn)了woperson,第二行的的man和woman也被person取代,只有person,沒有其他奇奇怪怪的字符串)
Every person in the world! Every woperson on earth!
Every person in the world! Every person on earth!
3.re.findall():額,這個最難搞,主要是為了講解(.*?)
re.findall()函數(shù)是返回某種形式(比如String)中所有與pattern匹配的全部字符串,返回形式為數(shù)組。
下面是findall()函數(shù)的兩種表示形式:(上面的代碼采取的便是第二種形式):
import re kk = re.compile(r'\d+') kk.findall('one1two2three3four4') #[1,2,3,4] #注意此處findall()的用法,可傳兩個參數(shù); kk = re.compile(r'\d+') re.findall(kk,"one123") #[1,2,3]
下面的是常用的正則表達式:
import re str = 'aabbabaabbaa' # 一個"."就是匹配除 \n (換行符)以外的任意一個字符 print(re.findall(r'a.b',str))#['aab', 'aab'] # *前面的字符出現(xiàn)0次或以上 print(re.findall(r'a*b',str))#['aab', 'b', 'ab', 'aab', 'b'] # 貪婪,匹配從.*前面為開始到后面為結(jié)束的所有內(nèi)容 print(re.findall(r'a.*b',str))#['aabbabaabb'] # 非貪婪,遇到開始和結(jié)束就進行截取,因此截取多次符合的結(jié)果,中間沒有字符也會被截取 print(re.findall(r'a.*?b',str))#['aab', 'ab', 'aab'] # 非貪婪,與上面一樣,只是與上面的相比多了一個括號,只保留括號的內(nèi)容 print(re.findall(r'a(.*?)b',str))#['a', '', 'a'] str = '''aabbab aabbaa bb''' #后面多加了2個b # 沒有把最后一個換行的aab算進來 print(re.findall(r'a.*?b',str))#['aab', 'ab', 'aab'] # re.S不會對\n進行中斷 print(re.findall(r'a.*?b',str,re.S))#['aab', 'ab', 'aab', 'aa\n b']
注意'.*?'是對它的前后部分作為開始結(jié)束部分進行截取,而'(.*?)'也是把其前后作為開始結(jié)束,但是只截取括號部分,不包含開始結(jié)束部分?。。。ㄍ瑫r在對前后部分的選擇時要注意特征明確點,就是與眾不同的的嘛,防止截取出的是其他部分啊)
re.findall中參數(shù)re.S的意義:
1.字符串變?yōu)椋ê竺娑嗉恿?個b)
str = '''aabbab aabbaa bb'''
2.參數(shù)無re.S,沒有把最后一個換行的aab算進來
print(re.findall(r'a.*?b',str)) #['aab', 'ab', 'aab']
3.參數(shù)有re.S,不會對\n進行中斷
print(re.findall(r'a.*?b',str,re.S)) #['aab', 'ab', 'aab', 'aa\n b']
在我們一開始的代碼中就有re.s,因為在爬取網(wǎng)頁的內(nèi)容時是按照一個一個塊的來爬取,可以理解為并列部分,會存在/n分行符。
def parse_response(html): pattern = re.compile('class=\'tab-details\'>(.*?)</span>',re.S) items = re.findall(pattern,html) print(items) return items
參考:
總結(jié)
到此這篇關(guān)于Python正則表達式re.compile()和re.findall()的文章就介紹到這了,更多相關(guān)Python正則re.compile()和re.findall()內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 10分鐘教你用Python實現(xiàn)微信自動回復(fù)功能
- python實現(xiàn)微信自動回復(fù)功能
- python itchat實現(xiàn)微信自動回復(fù)的示例代碼
- 利用python微信庫itchat實現(xiàn)微信自動回復(fù)功能
- python實現(xiàn)微信小程序自動回復(fù)
- python微信公眾號之關(guān)鍵詞自動回復(fù)
- python實現(xiàn)微信機器人: 登錄微信、消息接收、自動回復(fù)功能
- Python中re.compile函數(shù)的使用方法
- 關(guān)于Python中compile() 函數(shù)簡單實用示例詳解
- Python 正則 re.compile 真的必需嗎
- Python中請不要再用re.compile了
- python內(nèi)置函數(shù)compile(),complex()的使用
相關(guān)文章
python實現(xiàn)彩色圖轉(zhuǎn)換成灰度圖
這篇文章主要為大家詳細介紹了python實現(xiàn)彩色圖轉(zhuǎn)換成灰度圖,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-01-01使用Python實現(xiàn)with結(jié)構(gòu)的@contextmanager方法詳解
這篇文章主要介紹了使用Python實現(xiàn)with結(jié)構(gòu)的@contextmanager方法詳解,這個結(jié)構(gòu)的好處,一個是簡潔,一個是當我們對文件操作的邏輯很長的時候,不會因為忘了關(guān)閉文件而造成不必要的錯誤,需要的朋友可以參考下2023-07-07