Python爬蟲(chóng)(4)- Regular Expression正則表達(dá)式的使用

什么是正則表達(dá)式?

Python爬蟲(chóng)在獲得網(wǎng)頁(yè)的content之后,要通過(guò)一系列解析和查找去提取你想要的信息,這個(gè)時(shí)候正則表達(dá)式就起到了很大的作用。

正則表達(dá)式是對(duì)字符串操作的一種邏輯公式,就是事先定義好的一些特定字符、及這些特定字符的組合,組成 個(gè)“規(guī)則字符”,這個(gè)“規(guī)則字符” 來(lái)表達(dá)對(duì)字符的種過(guò)濾邏輯。

正則并不是python獨(dú)有的,其他語(yǔ)言也都有正則。python中的正則,封裝在了re模塊。

常用的匹配模式

\w 匹配字母數(shù)字及下劃線
\W 匹配f非字母數(shù)字下劃線
\s 匹配任意空白字符,等價(jià)于[\t\n\r\f]
\S 匹配任意非空字符
\d 匹配任意數(shù)字
\D 匹配任意非數(shù)字
\A 匹配字符串開(kāi)始
\Z 匹配字符串結(jié)束,如果存在換行,只匹配換行前的結(jié)束字符串
\z 匹配字符串結(jié)束
\G 匹配最后匹配完成的位置
\n 匹配一個(gè)換行符
\t 匹配一個(gè)制表符
^  匹配字符串的開(kāi)頭
\$ 匹配字符串的末尾
.  匹配任意字符,除了換行符,re.DOTALL標(biāo)記被指定時(shí),則可以匹配包括換行符的任意字符
[....]  用來(lái)表示一組字符,單獨(dú)列出:[amk]匹配a,m或k
[^...] 代表不在[]中的字符,[^abc]匹配除了a,b,c之外的字符
*匹配0個(gè)或多個(gè)的表達(dá)式
+匹配1個(gè)或者多個(gè)的表達(dá)式
?匹配0個(gè)或1個(gè)由前面的正則表達(dá)式定義的片段,非貪婪方式
{n}     精確匹配n前面的表示
{m,m}   匹配n到m次由前面的正則表達(dá)式定義片段,貪婪模式
a|b     匹配a或者b
()      匹配括號(hào)內(nèi)的表達(dá)式,也表示一個(gè)組

re.match()

嘗試從字符串的起始位置匹配一個(gè)模式,如果不是起始位置匹配成功的話,match()就會(huì)返回None。語(yǔ)法格式:re.match(pattern,string,flags=0)

import re

content= "hello 123 4567 World_This is a regex Demo"
result = re.match('^hello\s\d\d\d\s\d{4}\s\w{10}.*Demo\$',content)
print(result)
print(result.group())
print(result.span())
  • result.group()獲取匹配的結(jié)果
  • result.span()獲去匹配字符串的長(zhǎng)度范圍

泛匹配

其實(shí)相對(duì)來(lái)說(shuō)上面的方式并不是非常方便,其實(shí)可以將上述的正則規(guī)則進(jìn)行更改:

import re

content= "hello 123 4567 World_This is a regex Demo"
result = re.match("^hello.*Demo$",content)
print(result)
print(result.group())
print(result.span())

這段代碼的結(jié)果和上面常規(guī)匹配的結(jié)果是一樣的,但是寫(xiě)起來(lái)會(huì)方便很多。

匹配目標(biāo)

如果為了匹配字符串中具體的目標(biāo),則需要通過(guò)()括起來(lái),通過(guò)re.group()獲得結(jié)果后,如果正則表達(dá)式中有括號(hào),則re.group(1)獲取的就是第一個(gè)括號(hào)中匹配的結(jié)果。例子如下:

import re
content= "hello 1234567 World_This is a regex Demo"
result = re.match('^hello\s(\d+)\sWorld.*Demo$',content)
print(result)
print(result.group())
print(result.group(1))
print(result.span())

貪婪匹配

import re

content= "hello 1234567 World_This is a regex Demo"
result= re.match('^hello.*(\d+).*Demo',content)
print(result)
print(result.group(1))

result.group(1)會(huì)返回7而不是1234567,這是因?yàn)槟J(rèn)是貪婪匹配,前面的.*會(huì)盡可能多的匹配字符。如果想得到1234567,則需要改為result= re.match('^he.*?(\d+).*Demo',content),這樣結(jié)果就可以匹配到1234567。

匹配模式

很多時(shí)候匹配的內(nèi)容是存在換行的問(wèn)題的,這個(gè)時(shí)候的就需要用到匹配模式re.S來(lái)匹配換行的內(nèi)容。

import re

content = """hello 123456 world_this
my name is jamesqiu
"""
result =re.match('^he.*?(\d+).*?jamesqiu$',content,re.S)
print(result)
print(result.group())
print(result.group(1))

轉(zhuǎn)義

當(dāng)我們要匹配的內(nèi)容中存在特殊字符的時(shí)候,就需要用到轉(zhuǎn)移符號(hào),例子如下:

import re

content= "price is $5.00"
result = re.match('price is \$5\.00',content)
print(result)
print(result.group())

小結(jié)

  • 盡量使用泛匹配,使用括號(hào)得到匹配目標(biāo),盡量使用非貪婪模式,有換行符就用re.S
  • 強(qiáng)調(diào)re.match是從字符串的起始位置匹配一個(gè)模式

re.search

re.search掃描整個(gè)字符串返回第一個(gè)成功匹配的結(jié)果:

import re

content = "extra things hello 123455 world_this is a Re Extra things"
result = re.search("hello.*?(\d+).*?Re",content)
print(result)
print(result.group())
print(result.group(1))

其實(shí)這個(gè)時(shí)候我們就不需要在寫(xiě)^以及$,因?yàn)閟earch是掃描整個(gè)字符串。注意:所以為了匹配方便,我們會(huì)更多的用search,不用match,match必須匹配頭部,所以很多時(shí)候不是特別方便。

re.findall()

搜索字符串,以列表的形式返回全部能匹配的子串。

re.sub()

re.sub(正則表達(dá)式,替換成的字符串,原字符串)

import re

content = "Extra things hello 123455 World_this is a regex Demo extra things"
content = re.sub('\d+','',content)
print(content)

結(jié)果會(huì)將數(shù)字替換為為空。

re.compile()

將正則表達(dá)式編譯成正則表達(dá)式對(duì)象,方便復(fù)用該正則表達(dá)式。

import re
content= """hello 12345 world_this
fan
"""
pattern =re.compile("hello.*fan",re.S)
result = re.match(pattern,content)
print(result)
print(result.group())
最后編輯于
?著作權(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),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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