1. 程式人生 > >【Python3 爬蟲學習筆記】基本庫的使用 8—— 正則表示式 1

【Python3 爬蟲學習筆記】基本庫的使用 8—— 正則表示式 1

三、正則表示式

1.例項引入

開啟開源中國提供的正則表示式測試工具 http://tool.oschina.net/regex/ ,輸入待匹配的文字,然後選擇常用的正則表示式,就可以得出相應的匹配結果。
對於URL來說,可以用下面的正則表示式匹配:

[a-zA-z]+://[^\s]*

用這個正則表示式去匹配一個字串,如果這個字串中包含類似URL的文字,那就會被提取出來。
常用的匹配規則:

模式 描述
\w 匹配字母、數字及下劃線
\W 匹配不是字母、數字及下劃線
\s 匹配任意空白字元,等價於[\t\n\r\f]
\S 匹配任意非空字元
\d 匹配任意數字,等價於[0-9]
\D 匹配任意非數字的字元
\A 匹配字串開頭
\Z 匹配字串結尾,如果存在換行,只匹配到換行前的結束字串
\z 匹配字串結尾,如果存在換行,同時還會匹配換行符
\G 匹配最後匹配完成的位置
\n 匹配一個換行符
\t 匹配一個製表符
^ 匹配一行字串的開頭
$ 匹配一行字串的結尾
. 匹配任意字元,除了換行符,當re.DOTALL標記被指定時,則可以匹配包括換行符的任意字元
[…] 用來表示一組字元,單獨列出,比如[amk]匹配a、m或k
[ ^… ] 不在[]中的字元,比如[ ^abc ]匹配除了a、b、c之外的字元
* 匹配0個或多個表示式
+ 匹配1個或多個表示式
匹配0個或1個前面的正則表示式定義的片段,非貪婪方式
{n} 精確匹配n個前面的表示式
{n,m} 匹配n到m次由前面正則表示式的片段,貪婪方式
a b
() 匹配括號內的表示式,也表示一個組

2.match()

match(),向它傳入要匹配的字串以及正則表示式,就可以檢測這個正則表示式是否匹配字串。
match()方法嘗試從字串的起始位置匹配正則表示式,如果匹配,就返回匹配成功的結果;如果不匹配就會返回None。示例如下:

import re

content = 'Hello 123 4567 World_This is a Regex Demo'
print(len(content))
result = re.match('^Hello\s\d\d\d\s\d{4}\s\w{10}', content)
print(result)
print(result.group())
print(result.span())

執行結果:

41
<_sre.SRE_Match object; span=(0, 25), match='Hello 123 4567 World_This'>
Hello 123 4567 World_This
(0, 25)

這裡首先聲明瞭一個字串,其中包含英文字母、空白字元、數學等,然後寫謝了一個正則表示式,用它來匹配這個長字串。開頭的^ 是匹配字串的開頭,也就是以Hello開頭;然後\s匹配空白字元,用來匹配目標字串的空格;\d匹配數字,3個\d匹配123;然後再寫1個\s匹配空格;後面還有4567,可以寫4個\d來匹配,但這樣寫太繁瑣,所以後面可以跟{4}以代表匹配前面的規則4次,也就是匹配4個數字;然後後面再緊接1個空白字元,最後\w{10}匹配10個字母及下劃線。這裡其實並沒有把目標字串匹配玩,不過這樣易燃可以進行匹配,只不過匹配結果短一點而已。
而在match()方法中,第一個引數傳入了正則表示式,第二個引數傳入了要匹配的字串。
根據輸出結果,可以看到結果是SRE_Match物件,這證明成功匹配。該物件有兩個方法:group()方法可以輸出匹配到的內容,結果是Hello 123 4567 Word_This,這恰好是正則表示式所匹配的內容;span()方法可以輸出匹配的範圍,結果是(0,25),這就是匹配到的結果字串在原字串中的位置範圍。