當前位置:
首頁 > 最新 > python爬蟲知識點4-常用解析庫re正則

python爬蟲知識點4-常用解析庫re正則

江南有丹橘,經冬猶綠林。

豈依地氣暖?自有歲寒心。

可以薦嘉客,奈何阻重深。

運命唯所遇,循環不可尋。

徒言樹桃李,此木豈無陰?

今天探長和大家一起探討一個常見的解析庫,即re正則庫,探長將從什麼是正則、正則表達語法以及正則解析函數等幾個方面進行分析。

Part 1 - re是什麼?

re是正則表達式(規則表達式)的簡稱,又被稱為regex/regexp,是regular expression的簡稱。re是計算機科學中的一個概念,是對字元串/文本進行操作的一種邏輯公式,即用事先定義好的特定字元以及這些字元的特定組合,組合成一個「規則字元串」,通過這個「規則字元串」表達對字元串/文本的過濾邏輯,從而得到我們想要的數據結果。

re是一種通用的規則表達,為了使用方便,python內置了re模塊,我們可以通過import re語法在python中進行調用。

Part 2 - 正則表達語法

探長把正則表達語法分為兩大主要部分:字元表達語法、數量表達語法,其中字元表達語法用來聲明特定字元或符號,數量表達語法用來聲明匹配的字元或符號的數量。

2.1 字元表達語法

2.2 數量表達語法

2.3 其他表示式

Part 3 - 正則解析函數

3.1 re.match()

re.match()為正則的匹配函數,re.match(pattern, string, flags=0),其中pattern為匹配規則,string為原始文本,flags為可選參數,為匹配模式(例如re.S模式賦予.(點號)換行規則,即包括換行符在內的任意字元);

re.match()僅能從string的首字母進行匹配,不能從中間匹配,同時僅能返回匹配規則的第一個匹配結果,具有一定局限性。

importre

contents ="hello, my phone number is 123456789."

# re.match匹配數字

#錯誤的表達方法-沒有從字元串的首字母匹配

result = re.match("(d+)",contents)

print(result.group(1))

#正確的表達方法

result = re.match("hello.*?(d+)",contents)

print(result.group(1))

3.2 re.search()

re.search()為正則的匹配函數,re.search(pattern, string, flags=0),其中pattern為匹配規則,string為原始文本,flags為可選參數,為匹配模式(例如re.S模式賦予.(點號)換行規則,即包括換行符在內的任意字元);

re.search()彌補了match方法僅能從首字母進行匹配的缺陷,search方法可以從文本任意位置進行查詢匹配,但同樣僅能返回匹配規則的第一個匹配結果。

# re.search()

# re.search()不用從首字母開始匹配

result = re.search("(d+)",contents)

print(result.group(1))

注意:re.match()、re.search()均只能返回第一個匹配的結果,不能匹配所有符合條件的數據,因此具有一定局限性,如果想要實現多匹配,此時就需要使用findall方法。

3.3 re.findall()

re.findall()為正則的匹配函數,re.findall(pattern, string, flags=0),用於返回所有符合匹配的結果,其中pattern為匹配規則,string為原始文本,flags為匹配模式(例如re.S模式賦予.(點號)換行規則,即包括換行符在內的任意字元);

re.findall方法彌補了match/search方法的缺陷,可以返回匹配規則的所有結果。

# re.findall()

contents ="hello 001, I am 002"

result = re.findall("(d+)",contents)

print(result)

# 以列表形式返回所欲結果["001", "002"]

3.4 re.sub()

re.sub是正則的替換方法,re.sub(pattern, repl, string),其中pattern為被替換字元的查找規則,repl為替換字元,string為原始文本。

# re.sub()

contents ="hello 001, I am 數據小兵"

result = re.sub("(d+)","黃象探長",contents)

print(result)

# 返回的結果為"hello 黃象探長, I am 數據小兵"

3.5 re.compile()

re.compile是正則的編譯方法,re.compile(pattern, flags=0),把匹配規則編譯為匹配規則對象,方便隨時多次調用,其中pattern為匹配規則,flags為匹配模式,為可選參數。

# re.compile()

contents ="hello 001, I am 002"

patterns = re.compile("d+")

result = re.findall(patterns,contents)

print(result)

# 返回的結果同樣為列表形式的["001", "002"]

3.6 匹配規則-re.S

# 匹配規則

# 錯誤表達方法-沒有使用re.S匹配模式

contents ="""hello my phone number is 1234

5678, please call me"""

result = re.search("is (.*?),",contents)

print(result.group(1))

# 出現異常,不能返回正確結果

# 正確的表達方法

result = re.search("is (.*?),",contents,re.S)

print(result.group(1))

# 返回正確匹配結果"1234
5678"

Part 4 - 小案例

# 小案例-貓眼熱門電影

importrequests

importre

url ="http://maoyan.com/board"

headers = {"User-Agent":"Mozilla/5.0 (Windows "+

"NT 6.3; Win64; x64) AppleWebKit/"+

"537.36 (KHTML, like Gecko) Chrome/"+

"66.0.3359.181 Safari/537.36"}

# 定義網頁請求,獲取網頁內容

defget_html(ulr):

response = requests.get(url,headers=headers)

response.encoding ="utf-8"

html = response.text

returnhtml

# 定義解析過程,獲取想要的數據

defparse_html(content):

patterns = re.compile("class="board-index.*?>(.*?)"+

".*?

.*?data-val.*?>(.*?)"+

".*?

(.*?)

.*?

""releasetime">(.*?)

.*?class="integer">"+

"(.*?).*?fraction">(.*?)",re.S)

result = re.findall(patterns,content)

foriteminresult:

yield{

"rank": item[],

"name": item[1],

"actor": item[2].strip().split("主演:")[1],

"releasetime": item[3].strip().split(":")[1],

"score": item[4] + item[5]

}

if__name__ =="__main__":

html = get_html(url)

result = parse_html(html)

foriteminresult:

print(item)

運行上述程序可以得到爬取數據的結果,如下所示:

以上就是常用解析庫re的使用方法,探長希望能夠幫助到你!如有任何問題,歡迎與探長聯繫(在探長交流-->學習交流中可以加探長微信),或者進行留言互動!

茫茫人海中 期待與你相遇 在你我最美麗的時刻


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python數據小屋 的精彩文章:

python爬蟲知識點2-selenium的基礎知識點

TAG:Python數據小屋 |