Python爬蟲學習筆記(三)——正則表達式
介紹
正則表達式是一種處理字符串的強大工具,能實現字符串的檢索、替換、匹配驗證等。在爬蟲中,正則表達式主要用於從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爬蟲學習筆記(三)——正則表達式