1. 程式人生 > >Python爬蟲--- 1.4 正則表示式:re庫

Python爬蟲--- 1.4 正則表示式:re庫

原文連結:https://www.fkomm.cn/article/2018/7/20/19.html

想要學習爬蟲,正則表示式是一定繞不過去的一關。正則表示式是我們在篩選文字資料是經常使用的利器。簡單來說,一個正則表示式表達了符合這一規則的一系列的文字。

從“萬用字元”到正則表示式

玩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:點任意匹配模式,讓’.’可以匹配包括’\n’在內的任字元,同 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庫還有很多更加高階的用法,

我會在以後的實戰裡慢慢展現。

說到實戰,寫簡單爬蟲的基礎咱們已經都掌握了。