Python 內的正則使用基礎
正則修飾符的使用
Python 里用 flag
關鍵字參數表示正則修飾符。
修飾符 | 描述 |
---|---|
re.I | 使匹配對大小寫不敏感。 |
re.L | 做本地化識別(locale-aware)匹配。 |
re.M | 多行匹配,影響 ^ 和 ` |
-------- | ------------------------------------------------------------ |
re.I | 使匹配對大小寫不敏感。 |
re.L | 做本地化識別(locale-aware)匹配。 |
。 | |
re.S | 使 . 匹配包括換行在內的所有字符。 |
re.U | 根據 Unicode 字符集解析字符。這個標志影響 \w 、\W 、\b 、\B 。 |
re.X | 該標志通過給予你更靈活的格式以便你將正則表達式寫得更易於理解。 |
- 使用多個修飾符設置正則表達式的匹配模式:
re.I | re.M
。
python 里的反向引用、捕獲
- 反向引用:反斜杠加數字
\N
。 (?<name>exp)
:匹配exp
,並捕獲文本到名稱為name
的組里,也可以寫成(?'name'exp)
。
但是在 Python 中,為(?P<name>exp)
。
- 后續可使用
group(1)
或group(name)
獲取元表達式的匹配內容。
注意:反向引用需要前綴
r
,否則會被 Python 誤認為是進制數:比如\1
實際意義變成\x01
。
需求:單次匹配字符串
re.match()
函數
Python 中的 match()
,需要這個字符串以這個正則開頭,【檢驗字符串開頭有沒有正確】。如果字符串開頭有所不同就匹配失敗,返回 none
。(就是許多文章說的 “檢測 RE 是不是在 string 的開始位置匹配”)
re.fullmatch()
函數
fullmatch()
:字符串完全匹配正則,字符串完全匹配正則【檢驗這個字符串是不是我們所要的東西】
re.match()
正則如果使用了$
也是可以實現這種作用的。
re.search()
函數
search()
是在整個字符串里部分匹配,【字符串里有沒有這個的東西】。還有一點值得注意的是 search()
只會匹配一次。
需求:全文搜索替換字符串
re.sub()
函數
基本需求使用 replace()
,當然這里都說了 re 模塊了,復雜的替換應該使用 re.sub()
。它會替換字符串里的所有匹配。
substitute
n. 代替者; 代替物; 代用品; 替補(運動員);
v. (以…) 代替; 取代;
re.sub(pattern, repl, string, count=0, flags=0)
pattern
:正則表達式。
repl
:要替換成的字符串,可為函數。
- 如果是字符串會轉義里面的反斜杠。
- 如果為函數,接收一個匹配后的 Match 對象參數,需要返回要替換成的字符串。
string
:源字符串。
count
:最少要替換的次數。
flag
:正則表達式的匹配模式
- 注意:不要用例如
re.sub(r"\d+", "0", "123", re.I)
將修飾符給設置到count
里,應寫關鍵字參數flags=re.I
。
# 將“\n3.”等換為“【3】”
oriStr = '\n3.這是第三點'
resStr = re.sub(r'\n(\d+)\.', r'\n【\1】', oriStr)
print(resStr)
【3】這是第三點
需求:全文搜索多次匹配字符串
re.findall()
與 re.finditer()
函數
re.findall()
,返回所有匹配的一個列表。
re.findall(pattern, string, flags=0)
pattern.findall(string[, pos[, endpos]])
import re
result1 = re.findall(r'\d+','runoob 123 google 456')
pattern = re.compile(r'\d+') # 查找數字
result2 = pattern.findall('runoob 123 google 456')
result3 = pattern.findall('run88oob123google456', 0, 10)
print(result1)
print(result2)
print(result3)
輸出結果:
['123', '456']
['123', '456']
['88', '12']
re.finditer()
,返回所有匹配的一個迭代器。
迭代器只有在手動迭代的時候才會去匹配,如果目標字符串很長且不需要全部匹配的話,使用迭代器在獲取到目標字符串后停下,可以提高效率。
re.finditer(pattern, string, flags=0)
import re
it = re.finditer(r"\d+","12a32bc43jf3")
for match in it: # 這里僅作演示,將所有可能的都進行匹配了
print(match.group())
12
32
43
3
需求:以匹配的字符分割字符串
re.split()
函數
將匹配的字符串作為 split 的字符,以其切割字符串返回列表
re.split(pattern, string[, maxsplit=0, flags=0])
>>>import re
>>> re.split('\W+', 'runoob, runoob, runoob.') # 注意這里是大寫的W
['runoob', 'runoob', 'runoob', '']
>>> re.split('(\W+)', ' runoob, runoob, runoob.') # 小括號表示保留這個分隔符
['', ' ', 'runoob', ', ', 'runoob', ', ', 'runoob', '.', ''
重要的一點就是可以使用小括號,將分隔符保留下來。
本文部分參考:Python3 正則表達式 | 菜鳥教程