原文鏈接: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庫還有很多更加高級的用法,
我會在以後的實戰裏慢慢展現。
說到實戰,寫簡單爬蟲的基礎咱們已經都掌握了。