Python正則表示式簡記和re庫
正則表示式是定義搜尋模式的字元序列。通常這種模式被字串搜尋演算法用於字串上的“查詢”或“查詢和替換”操作,或者用於輸入驗證。
1. 正則表示式的語法
- . 表示任何單個字元
- [] 字符集,對單個字元給出取值範圍
- [^] 非字符集,對單個字元給出排除範圍
- *前一個字元0次或者無限次擴充套件
- +前一個字元1次或無限次擴充套件
- ?前一個字元0次或1次擴充套件
- |左右表示式任意一個
- {m}擴充套件前一個字元m次
- {m,n}擴充套件前一個字元m至n次
- ^匹配字串開頭
- $匹配字串結尾
- ()分組標記,內部只能使用|操作符
- d數字,等價於[0-9]
- w單詞字元,等價於[A-Z,a-z,0-9]
2. python中re庫的使用
Re庫是python的標準庫,主要用於字串匹配,呼叫方法:import re
2.1. 正則表示式字串的型別
re庫採用raw string型別來表示正則表示式,表示為
r'text'
raw string是不包含對轉義符的再次轉義的字串,總而言就是string會對字元轉義,而raw string不會,因為在正則表達中會出現轉義符號,所以避免繁瑣我們使用raw string
2.2. Re庫主要功能函式
- re.search ()在一個字串中搜索正則表示式的第一個位置,返回match物件
- re.match() 從一個字串的開始位置起匹配正則表示式,返回match物件
- re.findall() 搜尋字串,以列表型別返回全部能匹配的子串
- re.split() 將一個字串按照正則表示式匹配結果進行分割,返回列表型別
- re.finditer() 搜尋字串,返回一個匹配結果的迭代型別,每個迭代元素是match物件
- re.sub() 在一個字串中替換所有匹配正則表示式的子串,返回替換後的字串
2.2.1. re.search(pattern, string, flags=0)
在一個字串中搜索正則表示式的第一個位置,返回match物件
- pattern : 正則表示式的字串或原生字串表示
- string : 待匹配字串
- 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}', 'BIT 100081') if match: print(match.group(0)) 結果為100081
2.2.2. re.match(pattern, string, flags=0)
從一個字串的開始位置起匹配正則表示式,返回match物件
引數同search函式
舉例說明:
import re match = re.match(r'[1-9]\d{5}', 'BIT 100081') print(match.group(0)) 結果會報錯,match為空,因為match函式是 從字串開始位置開始匹配,因為從開始位置沒有匹配到,所以為空
2.2.3. re.findall(pattern, string, flags=0)
搜尋字串,以列表型別返回全部能匹配的子串
引數同search
舉例說明:
import re ls=re.findall(r'[1-9]\d{5}', 'BIT100081 TSU100084') print(ls) 結果為['100081', '100084']
2.2.4. re.split(pattern, string, maxsplit=0, flags=0)
將一個字串按照正則表示式匹配結果進行分割返回列表型別
- maxsplit : 最大分割數,剩餘部分作為最後一個元素輸出
舉例說明 :
import re re.split(r'[1-9]\d{5}', 'BIT100081 TSU100084') 結果['BIT', ' TSU', ' '] re.split(r'[1-9]\d{5}', 'BIT100081 TSU100084', maxsplit=1) 結果['BIT', ' TSU100081']
2.2.5. re.finditer(pattern, string, maxsplit=0, flags=0)
搜尋字串,返回一個匹配結果的迭代型別,每個迭代元素是match物件
引數同search
舉例說明 :
import re for m in re.finditer(r'[1-9]\d{5}', 'BIT100081 TSU100084'): if m: print(m.group(0)) 結果為 100081 100084
2.2.6. re.sub(pattern, repl, string, count=0, flags=0)
在一個字串中替換所有匹配正則表示式的子串返回替換後的字串
- repl : 替換匹配字串的字串
- count : 匹配的最大替換次數
舉例說明:
import re re.sub(r'[1-9]\d{5}', ':zipcode', 'BIT100081 TSU100084') 結果為 'BIT:zipcode TSU:zipcode'
2.3 Re庫的另一種等價用法(面向物件)
rst=re.search(r'[1-9]\d{5}', 'BIT 100081') 函式式的呼叫,一次性操作
pat=re.compile(r'[1-9]\d{5}') rst=pat.search('BIT 100081') 編譯後多次操作
regex=re.complie(pattern,flags=0)
regex也有以上六種用法
2.4 Re庫的Match物件
Match物件是是一次匹配的結果,包含匹配的很多資訊
以下是Match物件的屬性
- .string 待匹配的文字
- .re 匹配時使用的patter物件(正則表示式)
- .pos 正則表示式搜尋文字的開始位置
- .endpos 正則表示式搜尋文字的結束位置
以下是Match物件的方法
- .group(0) 獲得匹配後的字串
- .start() 匹配字串在原始字串的開始位置
- .end() 匹配字串在原始字串的結束位置
- .span() 返回(.start(), .end())
2.5 Re庫的貪婪匹配和最小匹配
當正則表示式可以匹配長短不同的多項時,返回哪一個呢?Re庫預設採用貪婪匹配,即返回匹配最長的子串
最小匹配
- *? 前一個字元0次或無限次擴充套件,最小匹配
- +? 前一個字元1次或無限次擴充套件,最小匹配
- ?? 前一個字元0次或1次擴充套件,最小匹配
- {m,n}? 擴充套件前一個字元m至n次(含n),最小匹配