Python爬蟲— 1.4 正規表示式:re庫

圓方圓PYTHON學院發表於2019-02-28

原文連結: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爬蟲— 1.4 正規表示式:re庫

常用的正則表達例項:

注意一下 :
$ 表示結束匹配

Python爬蟲— 1.4 正規表示式:re庫

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 ,獲取資料,和廣大群友一起學習。

圓方圓python技術討論群
圓方圓python技術討論群

相關文章