1. 程式人生 > >爬蟲之正則表示式基礎篇

爬蟲之正則表示式基礎篇

一 點睛

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)等來獲取。