我們能夠使用 urllib 向網(wǎng)頁(yè)請(qǐng)求并獲取其網(wǎng)頁(yè)數(shù)據(jù)链瓦。但是抓取信息數(shù)據(jù)量比較大吨些,我們可能需要其中一小部分?jǐn)?shù)據(jù)鹏倘。對(duì)付剛才的難題,就需要正則表達(dá)式出馬了。正則表達(dá)式能幫助我們匹配過(guò)濾到我們需要的數(shù)據(jù)撮竿,但它學(xué)習(xí)起來(lái)非乘北悖枯燥無(wú)味。你可能會(huì)說(shuō)幢踏,我還沒(méi)有開(kāi)始想學(xué)習(xí)正則表達(dá)式髓需,你就來(lái)打擊我? 莫慌房蝉!層層遞進(jìn)地學(xué)習(xí)僚匆,一步一個(gè)腳印地學(xué)習(xí),很快就會(huì)學(xué)會(huì)了搭幻。對(duì)于爬蟲(chóng)咧擂,我覺(jué)得學(xué)會(huì)最基本的符號(hào)就差不多了。
1 正則表達(dá)式
下面是一張關(guān)于正則表達(dá)式字符的圖檀蹋,圖片資料來(lái)自CSDN松申。先把圖中字符了解清楚,基本上算是入門(mén)俯逾。
2 re 模塊
Python 自1.5版本起通過(guò)新增 re (Regular Expression 正則表達(dá)式)模塊來(lái)提供對(duì)正則表達(dá)式的支持贸桶。使用 re 模塊先將正則表達(dá)式填充到 Pattern 對(duì)象中,再把 Pattern 對(duì)象作為參數(shù)使用 match 方法去匹配的字符串文本桌肴。match 方法會(huì)返回一個(gè) Match 對(duì)象皇筛,再通過(guò) Match 對(duì)象會(huì)得到我們的信息并進(jìn)行操作。下面介紹幾個(gè) re 常用的函數(shù)识脆。
2.1 compile 函數(shù)
compile
是把正則表達(dá)式的模式和標(biāo)識(shí)轉(zhuǎn)化成正則表達(dá)式對(duì)象设联,供 match() 和 search() 這兩個(gè)函數(shù)使用。它的函數(shù)語(yǔ)法如下:
re.compile(pattern[, flags])
- 第一個(gè)參數(shù)是
pattern
灼捂,指的正則表達(dá)式。 - 第二個(gè)參數(shù)
flags
是匹配模式换团,是個(gè)可選參數(shù)悉稠。可以使用按位或'|'表示同時(shí)生效艘包,也可以在正則表達(dá)式字符串中指定的猛。匹配模式有以下幾種:
flag | 描述 |
---|---|
re.I(全拼:IGNORECASE) | 忽略大小寫(xiě)(括號(hào)內(nèi)是完整寫(xiě)法,下同) |
re.M(全拼:MULTILINE) | 多行模式想虎,改變'^'和'$'的行為(參見(jiàn)上圖) |
re.S(全拼:DOTALL) | 點(diǎn)任意匹配模式卦尊,改變'.'的行為 |
re.L(全拼:LOCALE) | 使預(yù)定字符類 \w \W \b \B \s \S 取決于當(dāng)前區(qū)域設(shè)定 |
re.U(全拼:UNICODE) | 使預(yù)定字符類 \w \W \b \B \s \S \d \D 取決于unicode定義的字符屬性 |
re.X(全拼:VERBOSE) | 詳細(xì)模式。這個(gè)模式下正則表達(dá)式可以是多行舌厨,忽略空白字符岂却,并可以加入注釋。 |
- 該方法返回的結(jié)果是一個(gè) Pattern 對(duì)象。
2.2 match 函數(shù)
match()
函數(shù)只在字符串的開(kāi)始位置嘗試匹配正則表達(dá)式躏哩,也就是說(shuō)只有在 0 位置匹配成功的話才有返回署浩。如果不是開(kāi)始位置匹配成功的話,match() 就返回 none扫尺。它的函數(shù)語(yǔ)法如下:
re.match(pattern, string[, flags])
- 第一個(gè)參數(shù):匹配的正則表達(dá)式
- 第二個(gè)參數(shù):要被匹配的字符串
- flags 是可選參數(shù)筋栋,跟 compile 用法相似
- 匹配成功 re.match 方法返回一個(gè)匹配的對(duì)象,否則返回None正驻。要想獲得匹配結(jié)果弊攘,既可以使用
groups()
函數(shù)獲取一個(gè)包含所有字符串的元組(從 1 到 所含的小組號(hào)),也可以使用group(組號(hào))
函數(shù)獲取某個(gè)組號(hào)的字符串姑曙。
match
函數(shù)用法的示例代碼:
import re
pattern = re.compile('Python')
text = 'Python python pythonn'
match = re.search(pattern, text)
if match:
print(match.group())
else:
print('沒(méi)有匹配')
2.3 search 函數(shù)
search()
函數(shù)是掃描整個(gè)字符串來(lái)查找匹配肴颊,它返回結(jié)果是第一個(gè)成功匹配的字符串。
re.search(pattern, string[, flags])
參數(shù)用法以及返回結(jié)果跟match
函數(shù)用法相同渣磷。
search
函數(shù)用法的示例代碼:
import re
pattern = re.compile('Python')
text = 'welcome to Python world!'
match = re.search(pattern, text)
if match:
print(match.group())
else:
print('沒(méi)有匹配')
2.4 findall 函數(shù)
findall
函數(shù)在字符串中搜索子串婿着,并以列表形式返回全部能匹配的所有子串。
re.findall(pattern, string[, flags])
參數(shù)用法以及返回結(jié)果跟match
函數(shù)用法相同醋界。
findall
函數(shù)用法的示例代碼:
import re
pattern = re.compile('\d+')
text = 'one1two2three3four4'
list = re.findall(pattern, text)
if list:
print(list)
else:
print('沒(méi)有匹配')
上篇文章:詳解 python3 urllib
推薦閱讀:學(xué)爬蟲(chóng)之道