正規表示式是定義搜尋模式的字元序列。通常這種模式被字串搜尋演算法用於字串上的“查詢”或“查詢和替換”操作,或者用於輸入驗證。
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),最小匹配
只要長度輸出可能不同的,都可以通過在操作符後增加?變成最小匹配