【Python3 爬蟲學習筆記】基本庫的使用 8—— 正則表示式 1
阿新 • • 發佈:2018-11-11
三、正則表示式
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),這就是匹配到的結果字串在原字串中的位置範圍。