爬蟲必學知識之正規表示式上篇

sergiojune發表於2018-03-18

這是日常學python的第12篇文章


在向網頁進行了提交請求之類的之後,我們可以得到了網頁的返回內容,裡面自然而然會有我們想要的資料,但是html元素文字這麼多,我們不可能一 一去找我們需要的資料,這時就需要用到正規表示式了,正規表示式是學爬蟲必須學的內容,而且不止python可以用,java等其他語言都可以用,所以學了好處大大。


什麼是正規表示式?


正規表示式就是一個特殊的字元序列,可以用於檢測一個字串是否與我們的所設定的字串相匹配。功能有快速檢索文字和快速替換一些文字的操作。


python裡面有個處理正規表示式的庫 re。有個方法


findall(pattern,string,flags)


用來匹配正則達式,我們就先用這個方法處理下。

引數如下:


  • pattern:正規表示式

  • string:要進行匹配的字串

  • flags:匹配的模式

結果是一個匹配內容的列表


爬蟲必學知識之正規表示式上篇

'\d' : 這個表示匹配單個0-9數字

'\D' : 與\d相反,匹配數字以外的內容

用程式碼來感受下:

import re#這個庫是用來使用正規表示式的
a='sg+sga5g45gaae3f23hgt13'
r=re.findall('\d',a)#這個就是根據\d的正規表示式來查詢對應字元,其中\d是對應0-9的數字
#查詢非數字用\D
r1=re.findall('\D',a)
print(r)
print(r1)
#結果
['5', '4', '5', '3', '2', '3', '1', '3']
['s', 'g', '+', 's', 'g', 'a', 'g', 'g', 'a', 'a', 'e', 'f', 'h', 'g', 't']
複製程式碼


可以看到找出了字串中的數字和非數字


如果我們在匹配一個字串時,中間內容是有多個變化的,我們需要應變多種不同的字元,如這個字串

a='abc,acc,agc,anc,afc,adc,aec'
複製程式碼

如果需要匹配這個字串時,我們就需要用到 [ ] ,用中括號括起來的字元,裡面的內容表示或關係,那來看看程式碼

import re
a='abc,acc,agc,anc,afc,adc,aec'
#現在查詢上面的中間字元為c或者f的字串
#這個要求可以用到字符集來實現
r=re.findall('a[cf]c',a)#[]表示字符集,裡面的內容是或關係
# 結果
['acc', 'afc']
複製程式碼


上面匹配了中間字元是c或者是f的字串,匹配中間字元非c和非f,可以在前面加個 ^ 符號

import re
r=re.findall('a[……cf]c',a)#[c-f]就是表示從c到f
print(r)
# 結果
['abc', 'agc', 'anc', 'adc', 'aec']
複製程式碼



上面只處理了中間字元為chu者f的字串,但是沒有匹配全部的,若要匹配全部,可以加個 - 符號,表示範圍,如下

import re
r=re.findall('a[b-n]c',a)#[c-f]就是表示從c到f
print(r)
# 結果
['abc', 'acc', 'agc', 'anc', 'afc', 'adc', 'aec']
複製程式碼


[b-n]:這個就是表示b到n的字元


匹配漢字:[\u4E00-\u9FA5]



概括字符集:

用一個 \ + 字母 表示一系列的字元的元字元,只能匹配單個字元,常用的如下


  • \w匹配數字和字元「不包括&符號」只匹配單詞,數字和下劃線

  • \W:與\w相反,這個包括空格和回車

  • \s:匹配空格字元,如空格,回車和製表符

  • \S:與\s相反

  • .:匹配除換行符之外的其他字元

  • 還有前面的\d\D也是


有個小技巧:如果想要匹配所有字元,就可以把上面的兩個相反的合併起來就可以了。


程式碼如下:

#概括字符集,就是用一個\加個字母來表示一類字元,比如剛開始的\d,\D
import re
a='hdsk\n122\rs3$ dkl%df36\t5&'
r=re.findall('\w',a)#這個是匹配數字和單詞
print(r)
#也可以匹配非數字非單詞
r=re.findall('\W',a)
print(r)
#匹配空格字元和製表符等其他字元
r=re.findall('\s',a)
print(r)
#匹配除換行符之外的其他字元
r=re.findall('.',a)
print(r)
# 結果
['h', 'd', 's', 'k', '1', '2', '2', 's', '3', 'd', 'k', 'l', 'd', 'f', '3', '6', '5']
['\n', '\r', '$', ' ', '%', '\t', '&']
['\n', '\r', ' ', '\t']
['h', 'd', 's', 'k', '1', '2', '2', '\r', 's', '3', '$', ' ', 'd', 'k', 'l', '%', 'd', 'f', '3', '6', '\t', '5', '&']
複製程式碼



數量詞:

當一個字元需要連續重複匹配多次時,就要用到這個。如匹配三個字元組成的字串:

[a-zA-z]{3} ,大括號裡面的表示重複次數。

若要匹配三到六個字元,大括號的就需要這樣寫:{3,6}.

程式碼如下;

#數量詞,當一個字元需要多次重複匹配時就需要用到
import re
a='python java111php23 html'
r=re.findall('[a-z]{3}',a)#重複多次就用大括號,括號內的數表示重複的次數
print(r)
#也可以重複一個範圍,表示匹配3到6個字元
r=re.findall('[a-z]{3,6}',a)
print(r)#這樣就可以把單詞都找出來了
# 結果
['pyt', 'hon', 'jav', 'php', 'htm']
['python', 'java', 'php', 'html']
複製程式碼


其他數量詞表示:

  • * :匹配零次或無限多次

  • +:匹配一次或以上

  • ?:匹配零次或者一次


a='pytho243python34pythonn'
#*表示匹配對應內容0次或者無限次
r=re.findall('python*',a)#這個就是代表對n字元的數量詞匹配
print(r)
#+表示匹配內容1次或者無限次
r=re.findall('python+',a)
print(r)
#?表示可以匹配0次或者1次,注意這個?和上面的非貪婪代表的意思不一樣
r=re.findall('python?',a)
print(r)
# 結果
['pytho', 'python', 'pythonn']
['python', 'pythonn']
['pytho', 'python', 'python']
複製程式碼


貪婪匹配:正規表示式預設為貪婪匹配,即匹配符合字串的最大長度,如上面的[a-zA-z]{3,6},他會趨於匹配長度為6的字串,匹配到條件不滿足時才停止匹配。

非貪婪匹配:就是趨於匹配長度最小的字串,匹配滿足第一個條件就會停止匹配

r=re.findall('[a-z]{3,6}',a)# 貪婪匹配
print(r)
r=re.findall('[a-z]{3,6}?',a)
print(r)#由於是非貪婪,所以匹配當第一個條件滿足時就停止匹配
# 結果
['python', 'java', 'php', 'html']
['pyt', 'hon', 'jav', 'php', 'htm']
複製程式碼


END

這篇文章只是介紹了下正規表示式的簡單用法,可以用來入門正則,下一篇文章講正規表示式高階點的用法。




留個小練習:寫一個正則來匹配生日,字串為:

  • 2005-06-09

  • 2005-6-9

  • 2005 6 9

  • 2005,06,09

可以把答案寫在留言區哈!


上述文章如有錯誤歡迎在留言區指出,如果這篇文章對你有用,點個贊,轉個發如何?



MORE
延伸閱讀

◐◑python爬蟲常用庫之requests詳解

◐◑ python使用requests+re簡單入門爬蟲

◐◑python爬蟲常用庫之urllib詳解



1803114089.png


日常學python

程式碼不止bug,還有美和樂趣

相關文章