Python正則表達(dá)式

前言

前文介紹了正則表達(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è)爬蟲代碼完善哦~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容