1. 程式人生 > 實用技巧 >python學習-第十二週:正則表示式

python學習-第十二週:正則表示式

python學習-第十二週:正則表示式簡介

Re 正則表示式

正則表示式,就是使用字元,轉義字元和特殊字元組成一個規則,
使用這個規則對文字的內容完成一個搜尋或匹配或替換的功能。

正則表示式的組成

普通字元: 大小寫字母,數字,符號 等
轉義字元:\w \W \d \D \s \S 等
特殊字元:.  * ? + ^ $ [] {} () 等
匹配模式:I U 。。。

普通字元

# 正則表示式的規則定義
import re
# 待搜尋字串
vars = 'ilove you'
# 正則表示式
reg = 'love'
# 呼叫正則函式
res = re.search(reg,vars).group()

轉義字元

# 轉義字元 \w \W \d \D \s \S ...
reg = '\w' # 代表 單個 字母、數字、下劃線
reg = '\W' # 代表 單個 非 字母、數字、下劃線
reg = '\d' # 代表 單個 數字
reg = '\D' # 代表 單個 非數字
reg = '\s' # 代表 單個 空格符或製表符
reg = '\S' # 代表 單個 非 空格符或製表符
reg = '\w\w\w\w\d' # 組合使用

特殊字元

# 特殊字元 . * + ? {} [] () ^ $
reg = '.'    # . 代表 單個的 任意字元 除了換行符之外
reg = '\w*'  # * 代表匹配次數  任意次數
reg = '\w+'  # + 代表匹配次數  至少要求匹配一次
reg = '\w+?' # ? 拒絕貪婪,就是前面的匹配規則只要達成則返回
reg = '\w{5}' # {} 代表匹配次數,{4} 一個數字時,表示必須匹配的次數
reg = '\w{2,4}' # {} 代表匹配次數,{2,5} 兩個數字時,表示必須匹配的區間次數
reg = '[A-Z,a-z,0-9,_]' # [] 代表字元的範圍 [A-Z,a-z,0-9,_] 效果等同 \w
reg = '\w+(\d{4})(\w+)'  # () 代表子組,括號中的表示式首先作為整個正則的一部分,另外會把符合小括號中的內容單獨提取一份

'''
*號的特點: 
    如果使用*號,那麼在匹配的開始處如果符合要求,
    則按照規則一直向後匹配,直到不符合匹配規則結束並把前面符合的資料返回
    
    如果在匹配的開始處就不符合要求,則直接返回,匹配到的次數為0
'''

匹配模式

  • re.U:在此模式下,\w、\d、\s等字元組簡記法的匹配規則會發生改變,比如\w能匹配Unicode中的“單詞字元”,包括中文字元,它有對應的模式修飾符u
  • re.A:讓\d、\w等字元組簡記法恢復到ASCII匹配規則,它有對應的模式修飾符a

re模組相關函式

re.match() 函式

  • 從頭開始匹配
  • 要麼第一個就符合要求,要麼不符合
  • 匹配成功則返回Match物件,否則返回None
  • 可以使用group()方法獲取返回的資料
  • 可以使用span()方法獲取匹配的資料的下標區間

re.search() 函式

  • 從字串開頭到結尾進行搜尋式匹配
  • 匹配成功則返回Match物件,否則返回None
  • 可以使用group()方法獲取返回的資料
  • 可以使用span()方法獲取匹配的資料的下標區間

search() 和 match() 方法的區別:

match()方法是從字串的開頭進行匹配,如果開始就不符合正則的要求,則匹配失敗,返回None
search()方法是從字串的開始位置一直搜尋到字串的最後,如果在整個字串中都沒有匹配到,則失敗,返回None

re.findall()

  • 按照正則表示式的規則在字元中匹配所有符合規則的元素,結果返回一個列表,如果沒有找到則返回空列表

re.finditer()

  • 按照正則表示式的規則在字元中匹配所有符合規則的元素,返回一個迭代器

re.sub() 搜尋替換

  • 按照正則表示式的規則,在字串中找到需要 被替換的字串,完成一個替換
  • 引數:
    • pattern: 正則表示式的規則,匹配需要被替換的字串
    • repl: 替換後的字串
    • string: 被替換的原始字串

compile()

可以直接將正則表示式定義為 正則物件,使用正則物件直接操作

示例:

import re

# 定義字串
varstr = 'ak555nk523'

# 找到連續三個數字
reg = '\d{3}'
res = re.findall(reg,varstr)   #['555', '523']
res = re.finditer(reg,varstr)  #[<re.Match object; span=(3, 6), match='555'>, <re.Match object; span=(9, 12), match='523'>]

# 找到數字,替換成字串
res = re.sub(reg,'AAA',varstr) #['a', 'k', 's', 'A', 'A', 'A', 'n', 'k', 'a', 'A', 'A', 'A']

# 直接定義正則表示式物件
reg = re.compile('\d{3}')
# 直接使用建立的正則物件,去呼叫對應的方法或函式
res = reg.findall(string=varstr) #['555', '523']

# 匹配手機號
varstr1 = '17610105211'
varstr2 = '1761010521a'
reg = '^1\d{10}$' # ^ 代表開頭  $ 代表結尾
res = re.findall(reg,varstr1)  #['17610105211']
res = re.findall(reg,varstr2)  #[]
# 可以正確識別varstr1為手機號

正則部分歸納完畢,下週總結面向物件程式設計OOP相關內容,下週見~