RE庫是python標準庫,主要用于字符串匹配。
re庫采用raw string類型。書寫格式為r'text'
原生字符串,是不包含轉義符的字符串。如果直接使用string 類型表示正則,則需要轉義掉轉義符。因此直接使用原生字符串較為簡單。
RE 的主要函數
re.search() #在字符串中搜索和正則匹配的第一個位置。
re.match() #從字符串開始位置起匹配。
re.findall() #搜索字符串,以列表返回全部匹配的子串。
re.split() #將一個字符串正則匹配結果進行分割,返回一個列表。
re.finditer() #搜索字符串,返回迭代類型,每個迭代元素都是一個match對象。
re.sub() #在一個字符串中替換所以匹配正則的子串,返回替代后的。
re.search
re.search(pattern, string, flags = 0)
利用正則pattern 匹配string,同時利用flags 控制查找。
其中的flags,表示正則表達式使用的控制標記。常用標記包括:
re.I #re.IGNORECASE,忽略正則的大小寫區分,[A-Z]可以匹配大小寫字母。
re.M #re.MULTILINE,可以使^ 能夠匹配給定字符串每行的開始部分。
re.S #re.DOTALL,可以使. 匹配所有的字符,包括默認下無法匹配的換行符。
嘗試一下
>>> import re
>>> match = re.search(r'[1-9]\d{5}', 'AHAU 200036')
>>> if match:
... print(match.group(0))
...
200036
re.match
re.match(pattern, string, flags = 0)
參數和search 一樣。
需要注意的是,如果是使用match,會從字符串的起始部分進行匹配。因此若不進行調整,即依舊為'AHAU 200036'
,match 則匹配不到。
>>> import re
>>> match = re.match(r'[1-9]\d{5}', '200036 AHAU')
>>> if match:
... print(match.group(0))
...
200036
re.findall
以列表返回全部匹配到的子串。
>>> match = re.findall(r'[1-9]\d{5}', '200036AHAU TSU100084 345')
>>> if match:
... print(match)
...
['200036', '100084']
re.split
將正則與字符串匹配的部分刪除,并將剩下內容進行分割。
re.match(pattern, string, maxsplit = 0, flags = 0)
maxsplit 表示最大分割數(識別并進行切割的最大數字),超過最大分割部分以整體輸出。
>>> re.split(r'[1-9]\d{5}', 'AHAU200036 TSU100084')
['AHAU', ' TSU', '']
增加maxsplit參數,只匹配并切割一次,剩下的部分以整體輸出。
>>> re.split(r'[1-9]\d{5}', 'AHAU200036 TSU100084', maxsplit = 1)
['AHAU', ' TSU100084']
re.finditer
迭代獲得每次匹配結果,返回一個match類型。
>>> for m in re.finditer(r'[1-9]\d{5}', 'AHAU200036 TSU100084'):
... if m:
... print(m.group(0))
...
200036
100084
re.sub
re.sub(pattern, repl, string, count = 0, flags = 0)
repl 表示替換匹配字符串的字符串
count 表示匹配的最大替換次數。(和maxsplit 的功能差不多)
>>> re.sub(r'[1-9]\d{5}', 'unknown', 'AHAU:200036 TSU:100084')
'AHAU:unknown TSU:unknown'
可以加一個count 參數
>>> re.sub(r'[1-9]\d{5}', 'unknown', 'AHAU:200036 TSU:100084', count = 1)
'AHAU:unknown TSU:100084'
re 的其他用法
對于一套正則表達式的多次使用,如果每一次都重新定義一遍pattern,未免顯得非常的繁瑣。我們可以使用一種面向對象的做法。
先講正則經過一次編譯,將正則的原生字符串編譯為一個正則表達式對象。
import re
zcode = re.complie(r'[1-9]\d{5}')
match = zcode.match('200036 AHAU')
search = zcode.search('TSU 100084')
而它的使用,也和基本使用是一摸一樣的。
詳談RE庫的match 對象
match 對象是search, match, finditer 這些方法返回的結果。
>>> match = re.search(r'[1-9]\d{5}', '200036AHAU TSU100084 345')
>>> match.group(0)
'200036'
>>> match
<re.Match object; span=(0, 6), match='200036'>
>>> type(match)
<class 're.Match'>
match對象的屬性
.string #待匹配的文本
.re #匹配時使用pattern對象(正則)
.pos #正則表達式搜索文本開始
.endpos #正則表達式搜索文本末尾
>>> m = re.search(r'[1-9]\d{5}', '200036AHAU TSU100084 345')
>>> m.string
'200036AHAU TSU100084 345'
>>> m.re
re.compile('[1-9]\\d{5}')
>>> m.pos
0
>>> m.endpos
24
match 對象的方法
.group(0) #獲得匹配后字符串
.start() #匹配字符串在原始字符串的開始位置
.end() #匹配字符串在原始字符串的結束位置
.span() #返回元組類型,包含start與end
>>> m.group(0)
'200036'
>>> m.start()
0
>>> m.end()
6
>>> m.span()
(0, 6)