python爬蟲基礎之正則表達式的基本了解(一)
正則表達式,是為了方便提取網頁里非結構化的數據,通常我們用的解析方法就是正則表達式或者是css和Xpath語法去提取網頁裡面的數據.
首先,我們在python裡面怎麼使用正則表達式.python提供了一個內置的re模塊,包含了正則表達式的所有功能.
# 導入re的正則表達式模塊import re
下面我們來介紹模塊的使用方法
一. 基本數據匹配
re.match函數
match函數,是嘗試從字元串開始匹配.如果不是起始位置匹配成功的話,match()就返回none來表示未匹配到相應的結果.
基本語法:
re.match(要匹配的字元串, 字元串整體, 用於控制正則表達式的匹配方式)
import restring = https://zhuanlan.zhihu.com/p/34065800a = re.match(https,string).span() # 從字元串開始匹配b = re.match(com,string) # 非從字元串開始匹配print(a)print(b)
輸出結果為:
(0, 5) # 返回的是字元串里的下標None
re.search函數
re.search 掃描整個字元串並返回第一個成功的匹配.
基本語法:
re.search(要匹配的字元串, 字元串整體, 用於控制正則表達式的匹配方式)
import restring = https://zhuanlan.zhihu.com/p/34065800https://zhuanlan.zhihu.com/p/34065800a = re.search(zhihu,string).span() # 匹配字元串裡面的zhihub = re.search(com,string).span() # 匹配字元串裡面的comprint(a)print(b)
輸出結果為:
(17, 22) #返回的是字元串里第一次匹配到的下標(23, 26)#可以用切片方法驗證一下,匹配是否正確print(string[17:22],shring[23:26])
re.match與re.search的區別
re.match只匹配字元串的開始,如果字元串開始不符合正則表達式,則匹配失敗,函數返回None;而re.search匹配整個字元串,直到找到一個匹配。
import restring = https://zhuanlan.zhihu.com/p/34065800https://zhuanlan.zhihu.com/p/34065800a = re.match(3,string,re.M) # 匹配字元串裡面的3b = re.search(3,string,re.M) # 匹配字元串裡面的3print(a)print(b)
輸出結果為:
None # 因為match方法是從字元串開頭匹配,3沒有在字元串的開頭,所以匹配不出來(29, 30)print(string[29:30]) #檢驗下標是否匹配正確.3
re.findall函數:
用於匹配字元串所有包含配製字元串的匹配方式.
基本語法:
re.findall(要匹配的字元串, 字元串整體, 用於控制正則表達式的匹配方式)
import restring = https://zhuanlan.zhihu.com/p/34065800https://zhuanlan.zhihu.com/p/34065800a = re.findall(34065800, string)print(a)
輸出結果:
[34065800, 34065800]
二.匹配方式及匹配規則
上面我們用到的都是固定的某個字元串,比如說zhifu,com還是3,這些特定的東西,檢索字元串內是不是包含這些東西而已.實際我們使用正則提取,是需要寫我們的匹配規則去匹配相關的字元串的.
下面我們先了解一下,正則的基本規則.
正則表達式模式(基本語法結構):
^ 用於匹配字元串的開頭
例:
import restring_a = https://zhuanlan.zhihu.com/p/34065800string_b = http://zhuanlan.zhihu.com/p/34065800a = re.findall(^https, string_a) b = re.findall(^https, string_b)print(a)print(b)
輸出結果:
[https] []
$ 用於匹配字元串的末尾
例:
import restring_a = https://zhuanlan.zhihu.com/p/34065800string_b = https://zhuanlan.zhihu.com/p/3406580a = re.findall(800$, string_a) b = re.findall(800$, string_b)print(a)print(b)
輸出結果:
[800][]
. 用於匹配除了換行符以外的任意字元串
例子:
import restring_a = z h_i.h u # 代表製表符string_b = z h_i.h
u #
代表換行符a = re.findall(........., string_a)b = re.findall(........., string_b)print(a)print(b)
輸出結果:
[z h_i.h u] # 製表符被正確匹配[]
* 用於匹配任意次字元串的表達式
例子:
import restring = https://zhuanlan.zhihu.com/p/34065800a = re.findall(h.*, string)b = re.findall(h*, string)print(a)print(b)
輸出結果:
[https://zhuanlan.zhihu.com/p/34065800][h, , , , , , , , , h, , , , , , , , , h, , h, , , , , , , , , , , , , , , , , ]
+ 用於匹配至少1次字元串表達式
例子:
import restring = https://zhuanlan.zhihu.com/p/34065800a = re.findall(h.+, string)b = re.findall(h+, string)print(a)print(b)
輸出結果:
[https://zhuanlan.zhihu.com/p/34065800][h, h, h, h]
? 用於匹配0個或1個由前面的正則表達式定義的片段,非貪婪方式
import restring = https://zhuanlan.zhihu.com/p/34065800a = re.findall(h.?, string)b = re.findall(h?, string)print(a)print(b)
輸出結果:
[ht, hu, hi, hu][h, , , , , , , , , h, , , , , , , , , h, , h, , , , , , , , , , , , , , , , , ]
d 表示只匹配數字,等價於 [0-9].
例子:
import restring = https://zhuanlan.zhihu.com/p/34065800a = re.findall(d, string)b = re.findall(d+, string) # 其它的方法可以私下測試print(a)print(b)
輸出結果:
[3, 4, 0, 6, 5, 8, 0, 0][34065800]
D 匹配任意非數字
import restring = https://zhuanlan.zhihu.com/p/34065800a = re.findall(D, string)b = re.findall(D+, string) # 其它的方法可以私下測試print(a)print(b)
輸出結果:
[h, t, t, p, s, :, /, /, z, h, u, a, n, l, a, n, ., z, h, i, h, u, ., c, o, m, /, p, /][https://zhuanlan.zhihu.com/p/]
w 匹配字母數字及下劃線
import restring = https://zhuanlan.zhihu.com/p/34065800a = re.findall(w, string)b = re.findall(w+, string) # 其它的方法可以私下測試print(a)print(b)
輸出結果:
[h, t, t, p, s, z, h, u, a, n, l, a, n, z, h, i, h, u, c, o, m, p, 3, 4, 0, 6, 5, 8, 0, 0][https, zhuanlan, zhihu, com, p, 34065800]
W匹配非字母數字及下劃線
import restring = https://zhuanlan.zhihu.com/p/34065800a = re.findall(W, string)b = re.findall(W+, string) # 其它的方法可以私下測試print(a)print(b)
輸出結果:
[:, /, /, ., ., /, /][://, ., ., /, /]
s 匹配任意空白字元,等價於 [
f].
import restring = https://
zhuanlan.zhihu.com/p/ 34065800# 實際樣式https://zhuanlan.zhihu.com/p/ 34065800a = re.findall(s, string)print(a)
輸出結果:
[
, ]
S匹配任意非空字元
import restring = https://
zhuanlan.zhihu.com/p/ 34065800# 實際樣式https://zhuanlan.zhihu.com/p/ 34065800a = re.findall(S+, string)print(a)
輸出結果:
[https://, zhuanlan.zhihu.com/p/, 34065800]
[] 用來表示一組字元
[^] 用來表示不在[]中的字元
import restring = https://zhuanlan.zhihu.com/p/34065800a = re.findall([zhiu], string)b = re.findall([^zhiu], string)print(a)print(b)
輸出結果:
[h, z, h, u, z, h, i, h, u][t, t, p, s, :, /, /, a, n, l, a, n, ., ., c, o, m, /, p, /, 3, 4, 0, 6, 5, 8, 0, 0]
()匹配小括弧內的表達式,也表示一個組
import restring = https://zhuanlan.zhihu.com/p/34065800a = re.findall((zhihu), string)print(a)
輸出結果
[zhihu]
{n}匹配l括弧內n個前面表達式
import restring = https://zhuanlan.zhihu.com/p/34065800a = re.findall(d{8}, string)print(a)
輸出結果:
[34065800]
| 管道符號代表或的關係通常結合小括弧使用
import restring = https://zhuanlan.zhihu.com/p/34065800a = re.findall((zhuanlan|zhihu), string)print(a)
輸出結果:
[zhuanlan, zhihu]
以下不是很常用,自行測試和了解
A匹配字元串開始
匹配字元串結束,如果是存在換行,只匹配到換行前的結束字元串。
z匹配字元串結束
G匹配最後匹配完成的位置。
匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, er 可以匹配"never" 中的 er,但不能匹配 "verb" 中的 er。
B匹配非單詞邊界。erB 能匹配 "verb" 中的 er,但不能匹配 "never" 中的 er。
, , 等.匹配一個換行符。匹配一個製表符。等 1...9匹配第n個分組的內容。
10匹配第n個分組的內容,如果它經匹配。否則指的是八進位字元碼的表達式。
可選標誌(用於控制正則表達式的匹配方式):
re.I 使匹配對大小寫不敏感
re.L做本地化識別(locale-aware)匹配
re.M多行匹配,影響 ^ 和 $ re.S使 . 匹配包括換行在內的所有字元
re.U根據Unicode字符集解析字元。這個標誌影響 w, W, , B.
re.X該標誌通過給予你更靈活的格式以便你將正則表達式寫得更易於理解
這些內容,我們將結合下一章實例的內容進行講解.
寫的不好請多指正.
作者: Sruty
推薦閱讀:
※手把手 | 20行Python代碼教你批量將PDF轉為Word
※【Python3網路爬蟲開發實戰】 1-開發環境配置
※全棧 - 8 爬蟲 使用urllib2獲取數據
※怎樣將一個24的n次方複雜度的計算優化?
※將來 UWP 會不會支持 python?