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']
'''


### 正則表達式的語法:

來一套言簡意賅的圖:

來幾個正則表達式的栗子:

![](http://i2.51cto.com/images/blog/201812/17/3919b3b8dcc38cf8ba84357aab3d228f.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

### 常用的正則表達實例:
**注意一下 :
$ 表示結束匹配**

![](http://i2.51cto.com/images/blog/201812/17/dea2ebce632b1a5b028ff5de7d641911.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

## 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庫還有很多更加高級的用法,

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

說到實戰,寫簡單爬蟲的基礎咱們已經都掌握了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章