從零開始的Python學習Episode 15——正規表示式

微笑小狗發表於2018-10-31

正規表示式

 

正規表示式(或 RE)是一種小型的、高度專業化的程式語言,(在Python中)它內嵌在Python中,並通過 re 模組實現,所以使用時要匯入re模組。正規表示式模式被編譯成一系列的位元組碼,然後由用 C 編寫的匹配引擎執行。

 

先說幾個元字元  . ^ $ * + ? { }

 

import re

ret = re.findall(`t...r`, `hellotomorrow`)
print(ret)  # [`tomor`]

ret = re.findall(`^r.w`, `r1whellotomorr2w`)
print(ret)  # [`r1w`]

ret = re.findall(`r.w$`, `r1whellotomorr2w`)
print(ret)  # [`r2w`]
ret = re.findall(`hello$`, `r1whellotomorr2w`)
print(ret)  # [`awwwn`]

ret = re.findall(`abc*`, `abcccc`)  # 貪婪匹配[0,+oo]
print(ret)  # [`abcccc`]
ret = re.findall(`abc*`, `ab`)  # 貪婪匹配[0,+oo]
print(ret)  # [`ab`]

ret = re.findall(`abc+`, `abccc`)  # [1,+oo]
print(ret)  # [`abccc`]

ret = re.findall(`abc?`, `abccc`)  # [0,1]
print(ret)  # [`abc`]

ret = re.findall(`abc{1,4}`, `abccc`)
print(ret)  # [`abccc`] 貪婪匹配

ret=re.findall(`abc*?`,`abcccccc`)
print(ret)#[`ab`] 當* + ?的後面再加上?的話就會變成惰性匹配

 

元字元:[ ]

import re
ret = re.findall(`a[bc]d`,`abd`)
print(ret)#[`abd`],選b或c

ret = re.findall(`[a-z]`,`abd`)
print(ret)#[`a`, `b`, `d`],選出a到z的元素

ret = re.findall(`[.*+]`,`a.b+c*`)
print(ret)#[`.`, `+`, `*`],消除某些元字元的特殊功能

ret = re.findall(`[1-9]`,`adc51ca`)
print(ret)#[`5`, `1`],選出1到9之間的數字

ret = re.findall(`[^ab]`,`jnan21b`)
print(ret)#[`j`, `n`, `n`, `2`, `1`],選出除了a,b的元素

ret = re.findall(`dc`,`123 cad#4`)
print(ret)#[`1`, `2`, `3`, `4`],選出數字

 

元字元的轉義符

反斜槓後邊跟元字元去除特殊功能,比如.
反斜槓後邊跟普通字元實現特殊功能,比如d

d  匹配任何十進位制數;它相當於類 [0-9]。
D 匹配任何非數字字元;它相當於類 [^0-9]。
s  匹配任何空白字元;它相當於類 [

fv]。
S 匹配任何非空白字元;它相當於類 [^

fv]。
w 匹配任何字母數字字元;它相當於類 [a-zA-Z0-9_]。
W 匹配任何非字母數字字元;它相當於類 [^a-zA-Z0-9_]
 匹配一個特殊字元邊界,比如空格 ,&,#等

 

有一種特殊情況:

import re
m = re.findall(`blow`, `blow`)
print(m)#[]
m = re.findall(`\bblow`, `blow`)
print(m)#[`blow`]
m = re.findall(r`blow`, `blow`)
print(m)#[`blow`]

這是因為在python直譯器中“\”才相當於一個“”,而光寫一個“”是不能被識別的。

 

元字元( )分組

 

ret = re.search(`(?P<id>d{3})/(?P<name>w{2,3})`, `233/cn`)
print(ret.group())#233/cn
print(ret.group(`id`))#233

這段程式碼的意思是以‘/’為界限分為名為id(3個數字)和名為name(2個或3個字母)的兩個組,其中(?P<XXX>)是固定的格式,但可以不用這種格式。如果沒有用這種格式則沒有辦法按名字來訪問組中的資料,按需求來選擇是否要用。而search()是掃描整個string查詢匹配,會掃描整個字串並返回第一個成功的匹配。

 

re.compile()

compile()可以編譯正規表示式模式,返回一個物件。可以把常用的正規表示式編譯成正規表示式物件,方便後續呼叫及提高效率。

import re

ret = re.compile(`(d{3})/(w{2,3})`)
print(ret.search(`233/cn`).group())
#233/cn

 

re.match()

只檢測是不是在string的開始位置匹配,若在開頭檢測不到,則返回空。

ret = re.match(`233`,`2334567`)
print(ret)
#<re.Match object; span=(0, 3), match=`233`>
#可以通過ret.span()檢視其終止點,通過ret.group()檢視匹配到的內容。

 

re.search()

掃描整個string查詢匹配,會掃描整個字串並返回第一個成功的匹配.

import re

ret = re.compile(`(d{3})/(w{2,3})`)
print(ret.search(`233/cn`).group())
#233/cn,也可以像match那樣用span和group

 

re.split()

原型是re.split(pattern, string, maxsplit=0)

通過正規表示式將字串分離。如果用括號將正規表示式括起來,那麼匹配的字串也會被列入到list中返回。maxsplit是分離的次數,maxsplit=1分離一次,預設為0,不限制次數。

import re

ret = re.split(`s`,`adsnjfsnja`)
print(ret)
#[`ad`, `njf`, `nja`]

 

re.sub()

替換目標字串中的部分內容,格式為sub(`要匹配的型別`,`替換的內容`,`目標字串`,`替換次數`)

import re

ret = re.sub(`d`,`abc`,`1bd,2fg`)
print(ret)#abcbd,abcfg
ret = re.sub(`d`,`abc`,`1bd,2fg`,1)
print(ret)#abcbd,2fg

 

re.finditer()

把匹配到的內容放到一個迭代器中,返回一個迭代器物件。

import re

ret = re.finditer(`d`,`a1b2c3,4`)
print(ret)#<callable_iterator object at 0x0000021C112E8240>
print(next(ret).group())#1

 

相關文章