
前言
前文介紹了正則表達(dá)式的定義和使用方法,今天我們就正式講解Python中是如何使用正則表達(dá)式的,最后,通過一個(gè)簡單的正則表達(dá)式運(yùn)用,爬取網(wǎng)絡(luò)中的網(wǎng)頁數(shù)據(jù)。
re庫使用
在Python中使用正則表達(dá)式,需要re這個(gè)第三方庫,這個(gè)庫是python自帶的,不需要自己安裝。
re庫中有很多函數(shù)方法供我們使用,我們就一一簡單介紹下使用方法。
match函數(shù)
從字符串的起始位置匹配一個(gè)模式,如果不是起始位置匹配成功的話,match就返回none。
re.match(pattern, string, flags=0)
- pattern:匹配的正則表達(dá)式
- string:匹配的字符串
- flags:標(biāo)志位,用于控制正則表達(dá)式的匹配方式
其實(shí)flags就是我們前文中說的可選標(biāo)記(修飾符),如果需要使用多個(gè)修飾符,可以通過按位 OR(|) 它們來指定。如 re.I | re.M 被設(shè)置成 I 和 M 標(biāo)志。

我們來看下案例:
import re
text = 'Welcom to Wuhan'
print(re.match('welcom',text,re.I))
print(re.match('welcom',text,re.I).group())
print(re.match('welcom',text,re.I).span())
print(re.match('to',text))
# <re.Match object; span=(0, 6), match='Welcom'>
# Welcom
# (0, 6)
# None
該函數(shù)返回的是個(gè)對(duì)象(包括匹配的子字符串和在句中的位置索引),如果只需要子字符串,需要用 group() 函數(shù),索引用span()函數(shù)。
search函數(shù)
不同于match函數(shù),search函數(shù)掃描整個(gè)字符串并返回第一個(gè)成功的匹配。
re.search(pattern, string, flags=0)
import re
text = 'Welcom to Wuhan'
print(re.search('welcom',text,re.I))
print(re.search('to',text))
#<re.Match object; span=(0, 6), match='Welcom'>
# <re.Match object; span=(7, 9), match='to'>
findall函數(shù)
這個(gè)函數(shù)是我們經(jīng)常要使用的函數(shù),使用率極高,他在字符串中找到正則表達(dá)式所匹配的所有子串,并返回一個(gè)列表,如果沒有找到匹配的,則返回空列表。
findall(pattern, string, flags=0)
import re
text = '123abc456dfg'
result = re.findall("\d+", text)
print(result)
# ['123', '456']
finditer函數(shù)
和 findall 類似,在字符串中找到正則表達(dá)式所匹配的所有子串,并把它們作為一個(gè)迭代器返回。
re.finditer(pattern, string, flags=0)
import re
text = '123abc456dfg'
result = re.finditer("\d+", text)
for i in result:
print(i.group())
# 123
# 456
sub函數(shù)
將符合的匹配項(xiàng)替換成其他的字符串。
re.sub(pattern, repl, string, count=0, flags=0)
import re
text = '123abc456dfg'
result = re.sub("\d+", '---', text)
print(result)
# ---abc---dfg
split函數(shù)
split 方法按照能夠匹配的子串將字符串分割后返回列表。
re.split(pattern, string[, maxsplit=0, flags=0])
import re
text = '123abc456dfg'
result = re.split("\d+", text)
print(result)
# ['', 'abc', 'dfg']
compile函數(shù)
這個(gè)函數(shù)會(huì)返回一個(gè)正則表達(dá)式( Pattern )對(duì)象,供其他函數(shù)使用。多次使用某個(gè)正則表達(dá)式時(shí)推薦使用正則對(duì)象Pattern 以增加復(fù)用性。
import re
text = '123abc456dfg'
pattern = re.compile("\d+")
result = pattern.findall(text)
print(result)
# ['123', '456']
爬蟲小案例
其實(shí)我們?cè)谂老x時(shí),用的最多的就是findall函數(shù),我們以糗事百科的段子為例(https://www.qiushibaike.com/text/)。
我們需要獲取每個(gè)發(fā)段子的用戶名稱,我們打開網(wǎng)頁的源代碼,可以發(fā)現(xiàn)所有的用戶名稱都在h2標(biāo)簽中。

所以,我們的正則表達(dá)式寫成下面的樣子
<h2>(.*?)</h2>
最終的代碼如下:
import requests
import re
url = 'https://www.qiushibaike.com/text/'
res = requests.get(url)
names = re.findall("<h2>(.*?)</h2>",res.text,re.S)
print(names)

學(xué)到這里,我希望讀者可以舉一反三,把這個(gè)爬蟲代碼完善哦~