爬蟲之正則表示式基礎篇
一 點睛
1 正則表示式工具
http://tool.oschina.net/regex/
2 測試一下
Hello, my phone number is 029-86432100 and email is 798103175@qq.com.com, and CSDN website is http://cddn.com.
3 說明
其實,這裡就是用了正則表示式匹配,也就是用一定的規則將特定的文字提取出來。比如,電子郵件開頭是一段字串,然後是一個@符號,最後是某個域名,這是有特定的組成格式的。
二 常用的匹配規則
模式 |
描述 |
\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 |
匹配a或b |
( ) |
匹配括號內的表示式,也表示一個組 |
Python的re庫提供了整個正則表示式的實現,利用這個庫,可以在Python中使用正則表示式。在Python中寫正則表示式幾乎都用這個庫。
三 match()的使用
1 點睛
向match傳入要匹配的字串以及正則表示式,就可以檢測這個正則表示式是否匹配字串。該方法會嘗試從字串的起始位置匹配正則表示式,如果匹配,就返回匹配成功的結果;如果不匹配,就返回None。
2 基本用法
2.1 程式碼
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())
2,2 執行結果
E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/3_3.py
41
<_sre.SRE_Match object; span=(0, 25), match='Hello 123 4567 World_This'>
Hello 123 4567 World_This
(0, 25)
2.3 說明
正則表示式開頭的^是匹配字串的開頭,也就是以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 World_This,這恰好是正則表示式規則所匹配的內容;span()方法可以輸出匹配的範圍,結果是(0, 25),這就是匹配到的結果字串在原字串中的位置範圍。
3 匹配目標
3.1 程式碼
# 使用()括號將想提取的子字串括起來。
# ()實際上標記了一個子表示式的開始和結束位置,被標記的每個子表示式會依次對應每一個分組,
# 呼叫group()方法傳入分組的索引即可獲取提取的結果。
import re
content = 'Hello 1234567 World_This is a Regex Demo'
# 這裡我們想把字串中的1234567提取出來,此時可以將數字部分的正則表示式用()括起來
# ,然後呼叫了group(1)獲取匹配結果。
result = re.match('^Hello\s(\d+)\sWorld', content)
print(result)
print(result.group())
print(result.group(1))
print(result.span())
3.2 執行結果
E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/3_3.py
41
<_sre.SRE_Match object; span=(0, 25), match='Hello 123 4567 World_This'>
Hello 123 4567 World_This
(0, 25)
<_sre.SRE_Match object; span=(0, 19), match='Hello 1234567 World'>
Hello 1234567 World
1234567
(0, 19)
3.3 說明
可以看到,我們成功得到了1234567。這裡用的是group(1),它與group()有所不同,後者會輸出完整的匹配結果,而前者會輸出第一個被()包圍的匹配結果。假如正則表示式後面還有()包括的內容,那麼可以依次用group(2)、group(3)等來獲取。