Python爬蟲(4)- Regular Expression正則表達式的使用

什么是正則表達式?

Python爬蟲在獲得網頁的content之后,要通過一系列解析和查找去提取你想要的信息,這個時候正則表達式就起到了很大的作用。

正則表達式是對字符串操作的一種邏輯公式,就是事先定義好的一些特定字符、及這些特定字符的組合,組成 個“規則字符”,這個“規則字符” 來表達對字符的種過濾邏輯。

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

常用的匹配模式

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

re.match()

嘗試從字符串的起始位置匹配一個模式,如果不是起始位置匹配成功的話,match()就會返回None。語法格式: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()獲取匹配的結果
  • result.span()獲去匹配字符串的長度范圍

泛匹配

其實相對來說上面的方式并不是非常方便,其實可以將上述的正則規則進行更改:

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())

這段代碼的結果和上面常規匹配的結果是一樣的,但是寫起來會方便很多。

匹配目標

如果為了匹配字符串中具體的目標,則需要通過()括起來,通過re.group()獲得結果后,如果正則表達式中有括號,則re.group(1)獲取的就是第一個括號中匹配的結果。例子如下:

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)會返回7而不是1234567,這是因為默認是貪婪匹配,前面的.*會盡可能多的匹配字符。如果想得到1234567,則需要改為result= re.match('^he.*?(\d+).*Demo',content),這樣結果就可以匹配到1234567。

匹配模式

很多時候匹配的內容是存在換行的問題的,這個時候的就需要用到匹配模式re.S來匹配換行的內容。

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))

轉義

當我們要匹配的內容中存在特殊字符的時候,就需要用到轉移符號,例子如下:

import re

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

小結

  • 盡量使用泛匹配,使用括號得到匹配目標,盡量使用非貪婪模式,有換行符就用re.S
  • 強調re.match是從字符串的起始位置匹配一個模式

re.search

re.search掃描整個字符串返回第一個成功匹配的結果:

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))

其實這個時候我們就不需要在寫^以及$,因為search是掃描整個字符串。注意:所以為了匹配方便,我們會更多的用search,不用match,match必須匹配頭部,所以很多時候不是特別方便。

re.findall()

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

re.sub()

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

import re

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

結果會將數字替換為為空。

re.compile()

將正則表達式編譯成正則表達式對象,方便復用該正則表達式。

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())
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,048評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,414評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,169評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,722評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,465評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,823評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,813評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,000評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,554評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,295評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,513評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,722評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,125評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,430評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,237評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,482評論 2 379

推薦閱讀更多精彩內容