本篇主頁內容:match的基本使用,search的基本使用,findall,finditer的基本使用,匹配中文,貪婪與非貪婪模式
Python爬蟲教程-19-資料提取-正規表示式(re)
- 正規表示式:一套規則,可以在字串文字中進行搜查替換等
- 正則使用步驟:
- 1.使用 compile 函式將正規表示式的字串編譯成一個 pattern 物件
- 2.通過 pattern 物件的一些方法對文字進行匹配,匹配結果是一個 match 物件
- 3.用 match 物件的方法,對結果進行操作
- 正則的常用方法:
- match:從開始位置開始查詢,一次匹配,即1次匹配成功則退出
- search:從任何位置開始查詢,一次匹配
- findall:全部匹配,返回列表
- finditer:全部匹配,返回迭代器
- split:分割字串,返回列表
- sub:替換
- 匹配中文
- 中文是Unicode編碼(utf-8也是Unicode編碼),範圍:主要在[u4e00-u9fa5]
- 中文全形逗號一類的不在[u4e00-u9fa5]範圍內
- 貪婪與非貪婪模式
- 貪婪模式:在整個表示式匹配成功的前提下,儘可能多的匹配
- 非貪婪模式:在整個表示式匹配成功的前提下,儘可能少的匹配
- python裡面數量詞預設是貪婪模式
- 例如:
- 查詢文字abbbbbbbccc
- re結果是: ab*
- 貪婪模式結果是:abbbbbbb
- 非貪婪模式結果是:a
案例v23 match的基本使用
# 正則結果match的使用案例
import re
# 以下正則分成2個組,以小括號為單位
# [a-z]表示出現小寫a-z任意字母都可以,+表示至少出現1次
# 兩組之間有一個空格,表示匹配的兩個英文字元之間有空格
s = r"([a-z]+) ([a-z]+)"
# 編譯
pattern = re.compile(s, re.I) # s, I表示忽略大小寫
m = pattern.match("Hello world wide web")
# group(0) 表示返回整個匹配成功的字串,即所有小組
s = m.group(0)
print("所有小組的匹配結果:\n", s)
# 返回匹配成功的整個字串的跨度,即所有小組
a = m.span(0)
print("所有小組的匹配結果跨度:\n", a)
# group(0) 表示返回的第一個分組匹配成功的字串
s = m.group(1)
print("第1小組的匹配結果:\n", s)
# 返回匹配成功的整個字串的跨度
a = m.span(1)
print("第1小組的匹配結果跨度:\n", s)
# groups() 列印出所有的小組,等價於m.group(1), m.group(2)...
s = m.groups()
print(s)
執行結果
從結果可以看到:匹配到兩個小組,一個Hello,一個world,中間的空格是外面的,程式碼中包含一些具體的輸出格式
案例v24 search的基本使用
# search的基本使用
import re
s = r'\d+'
pattern = re.compile(s)
# 無參數列示從頭開始查詢,到最後結束
m = pattern.search("one12two34three56")
print(m.group(0))
# 參數列明搜查的範圍,例如:10-40
m = pattern.search("one12two34three56", 10, 40)
print(m.group(0))
執行結果
因為是從第10個開始查詢,所以查到的是56
案例v25 findall,finditer的基本使用
# findall,finditer的基本使用
import re
s = r'\d+'
pattern = re.compile(s)
m = pattern.findall("I am 18 years old, and 185 high")
print(m)
n = pattern.finditer("I am 18 years old, and 185 high")
print(type(n))
# 迭代器使用for迴圈輸出
for i in n:
# 只輸出i會包含無用資料
print(i.group())
執行結果
查詢所有匹配的字串
匹配中文
# 中文unicode案例
import re
hello = u'你好,再見陌生人'
# 中文全形逗號一類的不在[u4e00-u9fa5]範圍內
pattern = re.compile(r'[\u4e00-\u9fa5]+')
m = pattern.findall(hello)
print(m)
執行結果
因為中文全形逗號一類的不在[u4e00-u9fa5]範圍內,所在 findall 返回的是一個列表,包含兩個值
更多文章連結:Python 爬蟲隨筆
- 本筆記不允許任何個人和組織轉載