上節(jié)課我們學習了如何使用 BeautifulSoup 來解析頁面睬涧,這節(jié)課我們來學習下如何使用正則來解析頁面模叙。
- 正則表達式的基本概念
- 正則表達式基本語法
- 正則表達式常用函數(shù)
通過學習正則表達式幾個常用函數(shù),可以根據(jù)需要對數(shù)據(jù)進行匹配篩選叫搁。
1. 正則表達式簡介
在編寫爬蟲的過程中纺蛆,我們需要解析網頁的內容算利。那么作為文本解析利器的正則表達式當然可以運用到我們的爬蟲開發(fā)中在辆。其實頁面解析過程無非是從海量的字符串中將我們所需要的數(shù)據(jù)匹配并剝離出來证薇,所以在正式的爬蟲開發(fā)中正則會經常被用到。
正則表達式是對字符串操作的邏輯公式匆篓。在提取網頁的數(shù)據(jù)的時候浑度,我們需要把源代碼轉換成字符串,然后通過正則表達式匹配想要的數(shù)據(jù)奕删。
在我們開始使用正則表達式進行模式查找之前,我們需要先熟悉一下正則表達式里面的字符的基本含義疗认,熟悉了它們之后完残,我們就可以很方便的書寫一些正則表達式進行模式匹配了。
2. 正則表達式基本語法
正則表達式的字符和含義
模式 | 描述 |
---|---|
. | 匹配任意字符横漏, 除了換行符 |
* | 匹配前一個字符0次或者多次 |
+ | 匹配前一個字符1次或者多次 |
谨设? | 匹配前一個字符0次或者1次 |
^ | 匹配字符串開頭 |
$ | 匹配字符串結尾 |
() | 匹配括號內的表達式,表示一個組 |
\s | 匹配空白字符 |
\S | 匹配任何空白字符 |
\d | 匹配數(shù)字缎浇,等于[0-9] |
\D | 匹配非數(shù)字扎拣,等于[^0-9] |
\w | 匹配字符數(shù)字,等于[A-Za-z0-9] |
\W | 匹配非字符數(shù)字素跺,等于[^A-Za-z0-9] |
[] | 表示一組字符 |
3. 正則表達式的常用方法
我們開發(fā)爬蟲使用的是 Python 語言二蓝,那么在 Python 中如何使用正則表達式呢?在 Python 中已經內置了正則表達式模塊 re
指厌,re
庫是內置在 Python 中的刊愚,不需要我們進行安裝,直接導入使用即可踩验。
這里我們主要詳細講解一下 re
庫中的幾種常用方法鸥诽。這幾種方法也是會經常用在爬蟲開發(fā)中的商玫,只要掌握了這些種方法,基本上在爬蟲開發(fā)中需要使用正則表達式的問題都可以解決牡借。
3.1 re.findall
findall 方法是找到所有的符合規(guī)則的匹配內容拳昌,具體語法如下:
re.findall(pattern, string, flags=0)
來看個例子,找出所有的字符串中的數(shù)字:
import re # 導入正則
example = 'abc 33 bbb 3223 yehgst adsfe3 332' # 創(chuàng)建目標字符串
pattern = '\d+'
re.findall(pattern, example)
效果如下圖所示:
3.2 re.search
re.search 掃描整個字符串钠龙,并返回第一個成功的匹配炬藤。具體語法如下:
re.search(pattern, string, flags=0)
來看個例子:
import re
example = "Python is the best language!"
re.search('\APython', example)
re.search('\AJava', example)
效果如下圖所示:
3.3 re.match
如果 string 開始的 0 或者多個字符匹配到了正則表達式樣式,就返回一個相應的匹配對象 俊鱼。 如果沒有匹配刻像,就返回 None ;注意它跟零長度匹配是不同的并闲。
re.match(pattern, string, flags=0)
實例:
import re
string = '5523 abc, cde 666623'
pattern = '(\d{4}) (\w{3})'
match = re.search(pattern, string)
match.group(1)
match.group(2)
match.groups()
效果如下:
3.4 re.split
用 pattern 分開 string 细睡。 如果在 pattern 中捕獲到括號,那么所有的組里的文字也會包含在列表里帝火。如果 maxsplit 非零溜徙, 最多進行 maxsplit 次分隔, 剩下的字符全部返回到列表的最后一個元素
re.split(pattern, string)
實例:
import re
string = 'aaabbb 212 dxsxasxw fdexx:3453423.'
pattern = '\d+'
result = re.split(pattern, string)
print(result)
效果如下:
3.5 re.sub
返回通過使用 repl 替換在 string 最左邊非重疊出現(xiàn)的 pattern 而獲得的字符串犀填。 如果樣式沒有找到蠢壹,則不加改變地返回 string。 repl 可以是字符串或函數(shù)九巡;如為字符串图贸,則其中任何反斜杠轉義序列都會被處理。 也就是說冕广,\n 會被轉換為一個換行符疏日,\r 會被轉換為一個回車附,依此類推撒汉。 未知的 ASCII 字符轉義序列保留在未來使用沟优,會被當作錯誤來處理。 其他未知轉義序列例如 & 會保持原樣睬辐。 向后引用像是 \6 會用樣式中第 6 組所匹配到的子字符串來替換
re.sub(pattern, replace, string)
實例:
import re
string = 'abc 3d a52a33 adex f45 6'
pattern = '\s+'
replace = ''
new_string = re.sub(pattern, replace, string)
print(new_string)
例子如下:
3.6 re.subn
行為與 sub() 相同挠阁,但是返回一個元組 (字符串, 替換次數(shù)).
re.subn(pattern, replace, string)
實例:
import re
string = 'abc 3d a52a33 adex f45 6'
pattern = '\s+'
replace = ''
new_string = re.subn(pattern, replace, string)
print(new_string)
例子如下:
4. 小結
這一小節(jié)溯饵,我們學習了正則表達式的基本語法侵俗,以及通過多個例子展示了正則表達式的使用方法,正則表達式難有一點大丰刊, 同學們需要多加練習坡慌,才能牢固的掌握。