Python爬蟲教程-19-資料提取-正規表示式(re)

肖朋偉發表於2018-09-06

本篇主頁內容: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 爬蟲隨筆


  • 本筆記不允許任何個人和組織轉載

相關文章