用正則表示式提取資訊
正則表示式,說白了就是用來匹配字元的,正則表示式是用來簡潔表達一組字串的表示式.
正則表通常被用來檢索、替換那些符合某個模式(規則)的文字。
很多程式語言都支援正則表示式進行字串操作。在程式碼中常簡寫為regex、regexp或RE。
比如Pythonz中就有一個叫:re 的正則表示式庫,這是Python的標準庫,安裝Python後自帶,使用時只需要
import re
我們可以通過requests獲取網頁的頁面資訊,但是其中的資訊太過於雜亂,我們需要從中提取我們需要的資訊,那麼我們可以用Python的正則表示式庫來提取我們需要的資訊,比如說,我們想要從中提取”百度一下,你就知道”的中文字元,我們這樣操作
這樣我們就可以把html頁面中的”百度一下,你就知道”的標籤從複雜凌亂的資訊中提取出來了,再經過一些處理就可以拿出來了
語法
那我們開始學習正則表示式的語法了 以下是正則表示式的常用操作符:
. 表示任何單個字元
[ ] 字符集,對單個字元給出取值範圍 [abc]表示a、b、c,[a‐z]表示a到z單個字元
[^ ] 非字符集,對單個字元給出排除範圍 [^abc]表示非a或b或c的單個字元
* 前一個字元0次或無限次擴充套件 abc* 表示 ab、abc、abcc、abccc等
+ 前一個字元1次或無限次擴充套件 abc+ 表示 abc、abcc、abccc等
? 前一個字元0 次或1次擴充套件 abc? 表示 ab、abc
| 左右表示式任意一個 abc|def 表示 abc、def
{m} 擴充套件前一個字元m次 ab{2}c表示abbc
{m,n} 擴充套件前一個字元m至n次(含n) ab{1,2}c表示abc、abbc
^ 匹配字串開頭 ^abc表示abc且在一個字串的開頭
$ 匹配字串結尾 abc$表示abc且在一個字串的結尾
( ) 分組標記,內部只能使用 | 操作符 (abc)表示abc,(abc|def )表示abc、def
\d 數字,等價於[0‐9]
\w 單詞字元,等價於[A‐Za‐z0‐9_]
這些都是非常常見的正則表示式操作符,記住了,大部分都能用了。
我們接下來看一下經典的正則表示式匹配例項
^[A‐Za‐z]+$ 由26個字母組成的字串
^[A‐Za‐z0‐9]+$ 由26個字母和數字組成的字串
^‐?\d+$ 整數形式的字串
^[0‐9]*[1‐9][0‐9]*$ 正整數形式的字串
[1‐9]\d{5} 中國境內郵政編碼,6位
[\u4e00‐\u9fa5] 匹配中文字元
\d{3}‐\d{8}|\d{4}‐\d{7} 國內電話號碼,010‐68913536
正則表示式庫
上面我們說過,re是Python的內建庫,不需要安裝,直接匯入即可
raw string型別(原生字串型別),也就是不包含對轉義符再次轉義的字串
re庫採用raw string型別表示正則表示式,表示為: r’text’
re庫的主要函式共有6個,分別是
re.search() 在一個字串中搜索匹配正則表示式的第一個位置,返回match物件
re.match() 從一個字串的開始位置起匹配正則表示式,返回match物件
re.findall() 搜尋字串,以列表型別返回全部能匹配的子串
re.split() 將一個字串按照正則表示式匹配結果進行分割,返回列表型別
re.finditer() 搜尋字串,返回一個匹配結果的迭代型別,每個迭代元素是match物件
re.sub() 在一個字串中替換所有匹配正則表示式的子串,返回替換後的字串
re.findall( )這個比較簡單常用,用法如下:
這個函式共有三個引數,pattern, string , flags
re.findall(pattern, string, flags=0)
搜尋字串,以列表型別返回全部能匹配的子串
∙ pattern : 正則表示式的字串或原生字串表示
∙ string : 待匹配字串
∙ flags 正則表示式使用時的控制標記
比如我們要從一堆字元中,把數字提取出來:
其他函式的使用例項
定向爬蟲
爬取豆瓣電影,上海熱映的電影:
我們需要定義一個函式,用於獲取豆瓣熱映的電影資訊:
import requests //匯入需要用到的庫
import re
def getHTMLText(url):
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
print("Erro_get")
我們還需要定義一個函式,用於提取所需要的電影資訊:
def parsePage(ilt,html):
tlt = re.findall(r'data-title\=\".*?\"',html)
for i in range(len(tlt)):
plt = eval(tlt[i].split('=')[1])
if plt in ilt:
pass
else:
ilt.append(plt)
然後第三個函式用於輸出電影列表:
def printInfo(ilt):
print("上 海 熱 映")
for i in ilt:
print(i)
再定義一個主函式去呼叫這些功能函式:
def main():
url = 'https://movie.douban.com/cinema/nowplaying/shanghai/'
kv = {'User-Agent' : 'Mozilla/5.0'}
list = []
html = getHTMLText(url)
parsePage(list,html)
printInfo(list)
main()
執行即可看到以下畫面:
總結
re庫的功能非常強大,這些只是一些非常淺顯的內容。
大家可以多實戰,掌握正則表示式的用法。