(2)非貪婪匹配
中文輸出對齊問題:
chr(12288)–用中文空格填充。
. 『表示任何單個字元』
『字符集, 對單個字元給出取值範圍。『』中的字元是或的關係』
[^] 『非字符集,對單個字元給出排除範圍。 』
* 『前乙個字元 0次或無限次擴充套件』
+ 『前乙個字元 1次或無限次擴充套件』
? 『前乙個字元0次或1次擴充套件』
| 『左右表示式任意1個』
{} 『 擴充套件前乙個字元m次』
『擴充套件前乙個字元m至n次(含n)』
^ 『匹配字串開頭, 如^abc,表示匹配的字串的開頭一定是 abc』
$ 『匹配字串結尾,abc$, 結束匹配。』
() 『分組標記,內部只能用|操作符,就是將括號內的內容看為乙個整體。』
\d 『數字,等價於[0-9]』
\w 『單詞字元,等價於 [a-za-z0-9_]』
^[a-za-z]+$ : 表示26個字母組成的字串
^[a-za-z0-9]+$ : 表示26個字母和數字組成的字串
^-?\d+$ : 表示整數形式的字串
^[0-9]*[1-9][0-9]*$ : 正整數形式的字串
[\u4e00-\u9fa5] : 匹配中文字元
\d-\d|\d-\d
:國內**號碼
(([1-9]?\d|1\d|2[0-4]\d|25[0-5]).)([1-9]?\d|1\d|2[0-4]\d|25[0-5])
: ip位址的正規表示式
常用函式:
re.findall() 搜尋字串,以列表形式返回全部能匹配的子串 (常用)
re.sub() 替換匹配到的子串,返回替換後的字串。 (常用)
re.spilt() 將乙個字串按照正則分割,返回列表型別 (常用)
re.search(
) 在乙個字串中搜尋匹配正規表示式的第乙個位置,返回match物件
re.match(
) 從乙個字串的開始位置起匹配正則,返回match物件
re.finditer(
) 搜尋字串,返回匹配結果的迭代形式。
詳細使用:
"""re.search()"""
re.search(pattern, string, flags=0)
::args: pattern:正規表示式
string: 要匹配字串
flags:正規表示式使用時的控制標記:
"""控制標記"""
re.i 忽略大小寫
re.m 正規表示式中的^操作符能將給定字串的每行當作匹配開始
re.s 正則中的.操作符能夠匹配所有字元,預設匹配除換行符外的所有字元。
:return
: 返回match物件
"""re.match()"""
re.match(pattern, string, flags=0)
:"""re.findall()"""
re.findall(pattern, string, flags=0)
:"""re.split()"""
re.split(pattern, string, maxsplit=
0, flags=0)
: args: maxsplit最大分割數(分割為多少個部分),剩餘部分作為最後乙個元素輸出.
"""re.finditer()"""
re.finditer(pattern, string, flags=0)
::return
: 返回乙個匹配結果的迭代型別,每個迭代元素是match物件。
"""re.sub()"""
re.sub(pattern, repl, string, count=
0, flags=0)
::args: repl:替換匹配字串的字串
count:匹配的最大替換次數
"""match物件的屬性"""
match物件的屬性:
.string: 待匹配的文字
.re 匹配時使用的patten物件(正規表示式)
.pos 正規表示式搜尋文字時的開始位置
.endpos 結束位置
.group(
0) 獲得匹配後的字串
.start(
)匹配字串在原始字串的開始位置
.end(
) 結束位置
.span(
) 返回(
.start(
).end(
))
正規表示式的另一種等價用法:
物件導向用法:編譯後的多次操作:
pat = re.compile(r'[1-9]\d')
rst = pat.search('bit 100081')
將正規表示式編譯稱為乙個正規表示式的型別。之後可直接呼叫pat的各種方法。
regex = re.compile(pattern, flags)
在一些正規表示式中經常會碰到.*?
,.+?
,.*
等,這些都是貪婪與非貪婪的匹配模式。
. 匹配任意單個字元;
* 匹配前乙個字元0次或無限次;
+ 匹配前乙個字元1次或無限次;
? 匹配前乙個字元0次或1次;
re 預設採用貪婪匹配,即輸出匹配最長的子串.*
表示返回最大匹配字串;
比如:
str
='base4,aaaadjiwsj19301309aaasjdf0fj2fjasdjf0aaaaa'
pattern =
'base4,(a.*aa)'
# .*表示任意字元的無限擴充套件,所以括號內表示,只要以a開頭,aa結尾的字串都滿足規則,但是會返回最大匹配長度,即貪婪匹配。
re_str = re.search(pattern,
str)
結果:base4,aaaadjiwsj19301309aaasjdf0fj2fjasdjf0aaaaa
當匹配的操作符有不同長度時,都可以新增乙個問號,來進行最短匹配。
.*?
和.+?
表示非貪婪匹配
比如:
str
='base4,aaaadjiwsj19301309aaasjdf0fj2fjasdjf0aaaaa'
pattern =
'base4,(a.*?aa)'
# .*表示任意字元的無限次擴充套件,所以括號內表示,只要以a開頭,aa結尾的字串都滿足規則,因為加了乙個?,會返回最小匹配長度0次擴充套件,即非貪婪匹配。
re_str = re.search(pattern,
str)
結果:base4,aaa
.+?
同理
python正規表示式元字元 正規表示式
字元 描述將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個 向後引用 或乙個八進位制轉義符。例如,n 匹配字元 n n 匹配乙個換行符。序列 匹配 而 則匹配 匹配輸入字串的開始位置。如果設定了 regexp 物件的 multiline 屬性,也匹配 n 或 r 之後的位置。匹配輸入字串的結束...
Python 正規表示式
1.在python中,所有和正規表示式相關的功能都包含在re模組中。2.字元 表示 字串的末尾 如 road 則表示 只有當 road 出現在乙個字串的尾部時才會匹配。3.字元 表示 字元中的開始 如 road 則表示 只有當 road 出現在乙個字串的頭部時才會匹配。4.利用re.sub函式對字串...
Python正規表示式
學習python自然而然就不得不面對正規表示式這個難題。當初在沒有學習python之前,自己也曾經嘗試著學習過正規表示式,但是那時候感覺很麻煩,很難懂,結果就是不了了之。但是現在學習python我用的書是 python基礎教程 第二版 這本書中對re模組的講解很簡單易懂,內容不多但起碼把人領進門了,...