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