1. 程式人生 > >Python爬蟲學習筆記(三)——正則表達式

Python爬蟲學習筆記(三)——正則表達式

斜杠 這一 seh 爬蟲 class 學習 常用方法 部分 介紹

介紹

正則表達式是一種處理字符串的強大工具,能實現字符串的檢索、替換、匹配驗證等。在爬蟲中,正則表達式主要用於從HTML裏提取所需要的信息

常用的匹配規則

模式 描述
\w 匹配字母、數字及下劃線
\W 匹配不是字母、數字及下劃線的字符
\s 匹配任意空白字符,等價於[\t\n\r\f]
\S 匹配任意非空字符
\d 匹配任意數字,等價於[0-9]
\D 匹配任意非數字的字符
\A 匹配字符串開頭
\Z 匹配字符串結尾,如果存在換行,只匹配到換行前的結束字符串
\z 匹配字符串結尾,如果存在換行,同時還會匹配換行符
\G 匹配最後匹配完成的位置
\n 匹配一個換行符
\t 匹配一一個制表符
^ 匹配一行字符串的開頭
$ 匹配一行字符串的結尾
. 匹配任意字符,除了換行符,當re.DOTALL 標記被指定時,則可以匹配包括換行符的任意字符
[...] 用來表示一一組字符,單獨列出,比如[amk]匹配a、 m或k
[^...] 不在[]中的字符,比如[^abc]匹配除了 a、b、c之外的字符
* 匹配0個或多個表達式
+ 匹配1個或多個表達式
? 匹配0個或1個前面的正則表達式定義的片段,非貪婪方式
{n} 精確匹配n個前面的表達式
{n,m} 匹配n到m次由前面正則表達式定義的片段,貪婪方式
a|b 匹配a或b
() 匹配括號內的表達式,也表示一個組

常用方法

match()
向它傳入要匹配的字符串以及正則表達式,就可以檢測這個正則表達式是否匹配字符串。這個方法會從字符串的起始位置開始匹配,如果不匹配,返回None。因為該方法在使用時需要考慮開頭的內容,這在做匹配時並不方便,因此更適合用來判斷某個字符串是否符合某個正則表達式。
示例如下:

import re

content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^He.*?(\d+).*Demo$',content)
print(result.group(1))

上述代碼涉及到貪婪匹配和非貪婪匹配,這個到後面在介紹
search()
這個方法與上一個方法的不同之處在於,它在匹配時會掃描整個字符串,然後返回第一個成功匹配的結果。換句話說,正則表達式是整個字符串的子串。如果沒有匹配的,就會返回None。

findall()
search()只能返回第一個匹配成功的結果,但有時候我們需要所有結果,這時候就可以用findall()方法了。該方法可以搜索整個字符串,然後返回匹配正則表達式的所有內容。

sub()
這個方法主要是用來修改文本。示例如下:

import re

content = 'fgah32jsehi543dasdf342'
content = re.sub('\d+\, '', content)
print(content)

這裏sub()就是把所有的數字刪除,返回結果為hjsehidasdf
此外,sub()還可以用來刪去字符串中幹擾匹配的字符,以此來簡化匹配
compile()
書上介紹這個方法可以將正則表達式編譯成正則表達式對象,以便在後面的匹配中復用。但我不是很理解正則表達式對象這一說法,如果單純用字符串存正則表達式也不是不可以,這個還有待進一步的探究。

其它

貪婪與非貪婪
貪婪匹配模式下,.會匹配盡可能多的字符,有時候會讓匹配少了一部分內容。非貪婪模式的寫法就是.?。示例如下:

import re

content = 'Hello 1234567 World_This is a Regex Demo'
regex = '^He.*?(\d+).*Demo$'
result1 = re.match('^He.*(\d+).*Demo$', content)
result2 = re.match('^He.*?(\d+).*Demo$', content)
print(result1.group(1))
print(result2.group(1))

返回結果為

7
1234567

從這個代碼中就可以看出貪婪和非貪婪的區別了

修飾符
正則表達式可以包含一些可選標誌修飾符來控制匹配的模式

修飾符 描述
re.I 使匹配對大小寫不敏感
re.L 做本地化識別匹配
re.M 多行匹配,影響^和$
re.S 使.匹配包括換行在內的所有字符
re.U 根據Unicode字符集解析字符,影響\w、\W、\b和\B
re.X 該標誌通過給予更靈活的格式以便你將正則表達式寫得更易於理解

轉義匹配
正則表達式定義了許多匹配模式,但如果目標字符串裏就包含對應語法的字符,就需要用轉義匹配了。類似於markdown語法,在所需要轉義的字符前加上反斜杠就好。

總結

正則表達式是第三章知識點的最後一節了,以所學的內容應該可以實現基本爬蟲了。我打算明天做一個小項目,按照書上的建議,大概是爬取貓眼電影排行榜吧。

Python爬蟲學習筆記(三)——正則表達式