原文連結:www.fkomm.cn/article/201…
想要學習爬蟲,正規表示式是一定繞不過去的一關。正規表示式是我們在篩選文字資料是經常使用的利器。簡單來說,一個正規表示式表達了符合這一規則的一系列的文字。
從“萬用字元”到正規表示式
玩linux的同學在bash裡一定經常用下面這一段程式碼:
$ rm -rf /*.txt·
這裡其實就是一個非常簡單的刪除當前目錄下所有txt檔案的命令, *號其實就一個 ‘萬用字元’。表示任何形式的資料。 從這裡我們就可以引出正規表示式的概念:
正規表示式是用來簡潔表達一組字串的表示式,或者你可以將它理解為高階版的 萬用字元 表示式
- 舉個例子:
import re
test = `python is the best language , pretty good !`
p = re.findall(`p+`,test)
print(p)
```
OUT:
[`p`, `p`]
```
複製程式碼
正規表示式的語法:
來一套言簡意賅的圖:
來幾個正規表示式的栗子:
常用的正則表達例項:
注意一下 :
$ 表示結束匹配
Python的re庫的基本使用
re庫是Python內建的標準庫,所以我們不用安裝,直接import re就能直接使用。
re庫有著非常強大的功能!學好re庫對我們爬蟲的編寫有極大的幫助!
# re庫 採用了 raw string 型別來表示正規表示式,
# 例如:
re1 = r`[1-9]d{5}`
# 這裡的正則表示1一個1~9的數字和5個0~9的數字
# 如:1000 就符合re標準
複製程式碼
使用raw string 的好處是 我們不用手動去再次寫轉義字元了。如果不用raw string 型別, 上面的正規表示式我們就得這麼寫:
re1 = `[1-9]\d{5}`
re庫的主要功能函式:
我們著重講一下 re.search這個函式:
```
re.search(pattern, string, flags=0)
在一個字串中搜尋匹配正規表示式的第一個位置
返回match物件
∙ pattern : 正規表示式的字串或原生字串表示
∙ string : 待匹配字串
∙ flags : 正規表示式使用時的控制標記
```
str1 = `hello , world ,life is short ,use Python .WHAT? `
a = re.search(r`w+`,str1)
print(a.group()) # hello
複製程式碼
可以看到 我們成功找到了第一個 字串 “hello”。
- 常用的第三個引數 flags:
re.IGNORECASE:忽略大小寫,同 re.I。
re.MULTILINE:多行模式,改變
和$的行為,同
re.M。
re.DOTALL:點任意匹配模式,讓’.’可以匹配包括’
’在內的任字元,同 re.S。
複製程式碼
我們來使用一下控制標記試試:
str1 = `hello , world ,life is short ,use
b = re.search(r`w.+D`,str1,re.I)
print(b.group())
# world
複製程式碼
可以看到r`w.+D` 成功匹配到了world。
我們再來說另一個常用函式re.findall()
```
re.findall(pattern, string, flags=0)
搜尋字串,以列表型別返回全部能匹配的子串
∙ pattern : 正規表示式的字串或原生字串表示
∙ string : 待匹配字串
∙ flags : 正規表示式使用時的控制標記
```
c = re.findall(r`w+`,str1)
print (c)
#[`hello`, `world`, `life`, `is`, `short`, `use`, `Python`, `WHAT`]
複製程式碼
可以看到,我們找整個字串中的所有單詞,並且以列表型別反回了。
好了,剩下的函式用法基本和上面相似,都很簡單的。用的時候稍微看一下引數就可以。我就不一一介紹了。
re庫的另一種用法
在前面的例子中,我們都是在呼叫方法是傳入一個原生字串來表示re表示式,但是在多次搜尋符合同一規則的資料時,這樣做就會使得效率大大降低。相對應的我們有替代的做法。
str2 = `hssso`
re1 = re.compile(r`h.{3}o`)
print(re1.findall(str1))
print(re1.findall(str2))
# [`hello`]
# [`hssso`]
複製程式碼
這樣,先把正則進行編譯,在進行查詢,就能大量節省時間,增加效率。
關於Match 物件:
match物件是一次匹配的結果,他包含了很多的資訊:
```
match 物件的屬性
.string : 待匹配的文字
.re : 匹配時使用的patter物件(正規表示式)
.pos : 正規表示式搜尋文字的開始位置
.endpos : 正規表示式搜尋文字的結束位置
```
d = re.search(r`e.+d`,str1)
print(d.group()) # ello , world
print (d.string) # hello , world ,life is short ,use Python .WHAT?
print (d.re) # re.compile(`e.+d`)
print (d.pos) # 0
print (d.endpos) # 48
複製程式碼
好了,關於re庫,我們暫時就先介紹到這裡,
只是介紹了一些淺顯的用法,re庫還有很多更加高階的用法,
我會在以後的實戰裡慢慢展現。
說到實戰,寫簡單爬蟲的基礎我們們已經都掌握了。
相關文章和視訊推薦
圓方圓學院彙集 Python + AI 名師,打造精品的 Python + AI 技術課程。 在各大平臺都長期有優質免費公開課,歡迎報名收看。
公開課地址:ke.qq.com/course/3627…
加入python學習討論群 78486745 ,獲取資料,和廣大群友一起學習。