爬蟲常常獲取到html文件,從中提取有效信息的一種方式就是用正則表達式,方法基礎(chǔ)但是強大。
正則表達式就是在字符串中尋找滿足某種條件的子串。將篩選條件表示出來的符號就是正則表達式。
Python內(nèi)置了re模塊,可用其完成正則表達式的匹配。
在re模塊中,常用的有5個函數(shù),match、search、findall、sub、compile。
re.match
re.match(pattern, string, flags=0)
pattern為正則表達式,
string是原始字符串,
flags是匹配模式。
match方法從(且只從)第一個字符開始匹配。
返回一個match對象
可以調(diào)用group、groups、span等函數(shù)。
re.search
與match相類似,只是search不是必須要匹配第一個字符。
re.findall
相當(dāng)于search的升級版。search只能匹配到第一個子串,而findall可以匹配所有子串。
re.sub
re.sub(pattern, repl, string, count=0, flags=0)
參數(shù)多了一個repl
sub是將原字符串中匹到的子串替換為repl
re.compile
re.compile(pattern, flags=0)
對于常用的正則表達式,可以先用compile,得到對象可以調(diào)用match、serach等函數(shù)。
常見問題
1.貪婪匹配
.* 可以匹配任意字符,會盡可能的多匹配字符,所以會導(dǎo)致某些問題。
比如用.(\d)匹配手機號,我們得到的手機號只有一位數(shù)字,因為其它數(shù)字被.匹配了。所以通常用 .*? 來進行非貪婪匹配,把字符留給后面的表達式。
2.匹配換行符
. 默認可以匹配除換行外的所有字符,如果把匹配模式設(shè)置為re.S,則 . 可以匹配換行符。
3.轉(zhuǎn)義字符
比如 ? 表示匹配0個或1個,但如果要匹配字符串中的 ? , 則要進行轉(zhuǎn)義:?。