Python常用的正則表示式處理函式詳解
正則表示式是一個特殊的字元序列,用於簡潔表達一組字串特徵,檢查一個字串是否與某種模式匹配,使用起來十分方便。
在Python中,我們通過呼叫re庫來使用re模組:
import re
正則表示式語法模式和操作符詳見:https://www.runoob.com/python/python-reg-expressions.html#flags
下面介紹Python常用的正則表示式處理函式。
re.match函式
re.match 函式從字串的起始位置匹配正則表示式,返回match物件,如果不是起始位置匹配成功的話,match()就返回None。
re.match(pattern,string,flags=0)
pattern:匹配的正則表示式。
string:待匹配的字串。
flags:標誌位,用於控制正則表示式的匹配方式,如:是否區分大小寫,多行匹配等等。具體引數為:
re.I:忽略大小寫。
re.L:表示特殊字符集 \w,\W,\b,\B,\s,\S 依賴於當前環境。
re.M:多行模式。
re.S:即 . ,並且包括換行符在內的任意字元(. 不包括換行符)。
re.U:表示特殊字符集 \w,\d,\D,\S 依賴於 Unicode 字元屬性資料庫。
re.X:為了增加可讀性,忽略空格和 # 後面的註釋。
import re #從起始位置匹配 r1=re.match('abc','abcdefghi') print(r1) #不從起始位置匹配 r2=re.match('def','abcdefghi') print(r2)
執行結果:
其中,span表示匹配成功的整個子串的索引。
使用group(num) 或 groups() 匹配物件函式來獲取匹配表示式。
group(num):匹配的整個表示式的字串,group() 可以一次輸入多個組號,這時它將返回一個包含那些組所對應值的元組。
groups():返回一個包含所有小組字串的元組,從 1 到 所含的小組號。
import re s='This is a demo' r1=re.match(r'(.*) is (.*)',s) r2=re.match(r'(.*) is (.*?)',s) print(r1.group()) print(r1.group(1)) print(r1.group(2)) print(r1.groups()) print() print(r2.group()) print(r2.group(1)) print(r2.group(2)) print(r2.groups())
執行結果:
上述程式碼中的(.*)和(.*?)表示正則表示式的貪婪匹配與非貪婪匹配,詳情見此:https://www.jb51.net/article/31491.htm
re.search函式
re.search函式掃描整個字串並返回第一個成功的匹配,如果匹配成功則返回match物件,否則返回None。
re.search(pattern,flags=0)
pattern:匹配的正則表示式。
string:待匹配的字串。
flags:標誌位,用於控制正則表示式的匹配方式,如:是否區分大小寫,多行匹配等等。
import re #從起始位置匹配 r1=re.search('abc','abcdefghi') print(r1) #不從起始位置匹配 r2=re.search('def','abcdefghi') print(r2)
執行結果:
使用group(num) 或 groups() 匹配物件函式來獲取匹配表示式。
group(num=0):匹配的整個表示式的字串,group() 可以一次輸入多個組號,這時它將返回一個包含那些組所對應值的元組。
groups():返回一個包含所有小組字串的元組,從 1 到 所含的小組號。
import re s='This is a demo' r1=re.search(r'(.*) is (.*)',s) r2=re.search(r'(.*) is (.*?)',s) print(r1.group()) print(r1.group(1)) print(r1.group(2)) print(r1.groups()) print() print(r2.group()) print(r2.group(1)) print(r2.group(2)) print(r2.groups())
執行結果:
從上面不難發現re.match與re.search的區別:re.match只匹配字串的起始位置,只要起始位置不符合正則表示式就匹配失敗,而re.search是匹配整個字串,直到找到一個匹配為止。
re.compile 函式
compile 函式用於編譯正則表示式,生成一個正則表示式物件,供 match() 和 search() 這兩個函式使用。
re.compile(pattern[,flags])
pattern:一個字串形式的正則表示式。
flags:可選,表示匹配模式,比如忽略大小寫,多行模式等。
import re #匹配數字 r=re.compile(r'\d+') r1=r.match('This is a demo') r2=r.match('This is 111 and That is 222',27) r3=r.match('This is 111 and That is 222',8,27) print(r1) print(r2) print(r3)
執行結果:
findall函式
搜尋字串,以列表形式返回正則表示式匹配的所有子串,如果沒有找到匹配的,則返回空列表。
需要注意的是,match 和 search 是匹配一次,而findall 匹配所有。
findall(string[,pos[,endpos]])
string:待匹配的字串。
pos:可選引數,指定字串的起始位置,預設為0。
endpos:可選引數,指定字串的結束位置,預設為字串的長度。
import re #匹配數字 r=re.compile(r'\d+') r1=r.findall('This is a demo') r2=r.findall('This is 111 and That is 222',11) r3=r.findall('This is 111 and That is 222',27) print(r1) print(r2) print(r3)
執行結果:
re.finditer函式
和 findall 類似,在字串中找到正則表示式所匹配的所有子串,並把它們作為一個迭代器返回。
re.finditer(pattern,flags=0)
pattern:匹配的正則表示式。
string:待匹配的字串。
flags:標誌位,用於控制正則表示式的匹配方式,如是否區分大小寫,多行匹配等。
import re r=re.finditer(r'\d+','This is 111 and That is 222') for i in r: print (i.group())
執行結果:
re.split函式
將一個字串按照正則表示式匹配的子串進行分割後,以列表形式返回。
re.split(pattern,string[,maxsplit=0,flags=0])
pattern:匹配的正則表示式。
string:待匹配的字串。
maxsplit:分割次數,maxsplit=1分割一次,預設為0,不限次數。
flags:標誌位,用於控制正則表示式的匹配方式,如:是否區分大小寫,多行匹配等。
import re r1=re.split('\W+','This is 111 and That is 222') r2=re.split('\W+','This is 111 and That is 222',maxsplit=1) r3=re.split('\d+','This is 111 and That is 222') r4=re.split('\d+',maxsplit=1) print(r1) print(r2) print(r3) print(r4)
執行結果:
re.sub函式
re.sub函式用於替換字串中的匹配項。
re.sub(pattern,repl,count=0,flags=0)
pattern:正則中的模式字串。
repl:替換的字串,也可為一個函式。
string:要被查詢替換的原始字串。
count:模式匹配後替換的最大次數,預設0表示替換所有的匹配。
import re r='This is 111 and That is 222' # 刪除字串中的數字 r1=re.sub(r'\d+','',r) print(r1) # 刪除非數字的字串 r2=re.sub(r'\D',r) print(r2)
執行結果:
參考資料:
https://www.runoob.com/python/python-reg-expressions.html#flags
到此這篇關於Python常用的正則表示式處理函式詳解的文章就介紹到這了,更多相關python 正則表示式處理函式內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!