一:學習內容
- 匹配單個字符與數字:.、[]、^、\d、\D、\w、\W、\s、\S
- 匹配錨字符(邊界字符):^、$、\A、\Z、\b、\B
- 匹配多個字符:(xyz) 、x?、x*、.*、x+、x{n}、x{n,}、x{n,m}、x|y
- 非貪婪匹配:*?、+?、??、{n,m}?
二:匹配單個字符與數字
1.點.:匹配除換行符以外的任意字符
2.[]:是字符集合,表示匹配方括號中所包含的任意一個字符
[0123456789] 表示匹配任意一個數字
[0-9] 表示匹配任意一個數字
[yml] 表示匹配'y','m','l'中任意一個字符
[a-z] 表示匹配任意一個小寫字符
[A-Z] 表示匹配任意一個大寫字符
[0-9a-zA-Z] 表示匹配任意一個數字和字母
[0-9a-zA-Z_] 表示匹配任意一個數字、字母和下划線
3.^:是脫字符,表示不匹配集合中的字符,注意^在[]中才表示不匹配,在其他位置意義不一樣
[^test] 表示匹配除了test這幾個字母以外的所有字符
[^0-9] 表示匹配所有的非數字字符
4.\d:匹配數字,效果同[0-9]
\d 表示匹配任意一個數字,這里可以不寫[],直接使用\d
[^\d] 表示匹配所有的非數字字符,效果同[^0-9]
5.\D:匹配非數字字符,效果同[^0-9]
6.\w:匹配數字、字母和下划線,效果同[0-9a-zA-Z]
7.\W:匹配非數字、字母和下划線,效果同[^0-9a-zA-Z]
8.\s:匹配任意的空白符(空格、換行、回車、換頁、制表符),效果同[ \f\n\r\t]
9.\S:匹配任意的非空白符(空格、換行、回車、換頁、制表符),效果同[^ \f\n\r\t]
10.舉例:
print(re.search(".","tester is a good girl!")) #.可以代表任意字符,所以匹配t,結果匹配一個t
print(re.search("[0123456789]","yml is a good gril 7")) #匹配結果為數字7
print(re.search("[tester]","tester is a good gril 7")) #匹配結果為一個t
print(re.search("[^tester]","tester is a good gril 7")) #匹配除tester之外的任意一個字符結果為空" "
print(re.search("[^0-9]","tester is a good gril 7")) #匹配一個非數字字符結果為t
print(re.search("\d","tester is a good gril 7")) #匹配結果為數字7
print(re.search("[^\d]","tester is a good gril 7")) #匹配結果為一個t
print(re.search("\D","tester is a good gril 7")) #匹配一個非數字字符結果為t
print(re.search("\w","tester is a good gril 7")) #匹配任意一個數字字母或下划線,結果為t
print(re.findall(".","_tester is test\nd girl 3")) #匹配除換行符以外的任意字符
print(re.findall(".","_tester is test\nd girl 3",flags=re.S)) #匹配包括換行符在內的任意字符
三:匹配錨字符(邊界字符)
1.^:行首匹配,注意^在[]中才表示不匹配集合中的字符
2.$:行尾匹配
3.\A:匹配字符串開始,它和^區別是:
\A只匹配整個字符串的開頭即使在re.M模式下,也不會匹配其他行的行首
^匹配的是每行的行首
4.\Z:匹配字符串結束,它和$區別是:
\Z只匹配整個字符串的結束即使在re.M模式下,也不會匹配其他行的行尾
$匹配的是每行的行尾
5.\b:匹配一個單詞的邊界,也就是指單詞和空格間的位置
6.\B:匹配非單詞的邊界,也就是指單詞和空格間的位置
7.舉例:
print(re.search("^test","test is a good girl")) #表示行首必須要是test開頭
print(re.search("girl$","test is a good girl")) #表示行尾必須要是girl結尾
print(re.search("\Atest","test is a good girl"))
print(re.findall("^test","test is a good girl\ntest is a good girl",flags=re.M))
print(re.findall("\Atest","test is a good girl\ntest is a good girl",flags=re.M))
print(re.findall("girl$","test is a good girl\ntest is a good girl",flags=re.M))
print(re.findall("girl\Z","test is a good girl\ntest is a good girl",flags=re.M))
print(re.findall(r"er\b","never"))
print(re.findall(r"er\B","never"))
print(re.findall(r"er\b","nerve"))
print(re.findall(r"er\B","nerve"))
四:匹配多個字符
說明:下方的x、y、z均為假設的普通字符,n、m為非負整數,不是正則表達式的元字符
1.(xyz):匹配小括號內的內容,()內的內容xyz作為一個整體去匹配
2.x?:匹配0個或者1個x,非貪婪匹配(盡可能少的匹配)
3.x*:匹配0個或者任意多個x,貪婪匹配(盡可能多的匹配)
.*:表示匹配0個或任意多個字符(換行符除外)
4.x+:匹配至少一個x,貪婪匹配(盡可能多的匹配)
5.x{n}:匹配確定的n個x,n是一個非負整數
6.x{n,}:匹配至少n個x,n是一個非負整數
7.x{n,m}:匹配至少n個最多m個x,注意:n <= m
8.x|y:|表示或,匹配的是x或y
9.舉例:
print(re.findall(r"(test)","test"))
print(re.findall(r"y?","ytesttest")) #匹配0個或1個
print(re.findall(r"y*","ytesttest")) #匹配0個或任意多個,貪婪匹配
print(re.findall(r"y+","ytesttest")) #匹配至少1個,貪婪匹配
print(re.findall(r"y{3}","ytestyyytest")) #匹配3個y
print(re.findall(r"y{3,}","yytestyyytest")) #匹配至少3個y
print(re.findall(r"y{3,6}","yytestyyytest")) #匹配至少3個y,最多6個y
print(re.findall(r"(t|T)est","tttestttttest")) #匹配t或T
print(re.findall(r"t|Test","tttestttttest"))
print(re.findall(r"((t|T)est)","tttestttttest"))
#需求:提取tester......girl
str = "tester is a good girl!tester is a nice girl!tester is a very dddd girl"
print(re.findall(r"tester.*girl",str))
print(re.findall(r"tester.*?girl",str)) #非貪婪
五:非貪婪匹配
1. *?:前一個字符0次或無限次擴展,最小匹配
print(re.findall(r"tes*","tessssssssssssss"))
print(re.findall(r"tes*?","tessssssssssssss"))
print(re.findall(r"tess*","tessssssssssssss"))
print(re.findall(r"tess*?","tessssssssssssss"))
2. +?:前一個字符1次或無限次擴展,最小匹配
print(re.findall(r"tes+","tessssssssssssss"))
print(re.findall(r"tes+?","tessssssssssssss"))
print(re.findall(r"tess+","tessssssssssssss"))
print(re.findall(r"tess+?","tessssssssssssss"))
3. ??:前一個字符0次或1次擴展,最小匹配
print(re.findall(r"tes?","tessssssssssssss"))
print(re.findall(r"tes??","tessssssssssssss"))
print(re.findall(r"tess?","tessssssssssssss"))
print(re.findall(r"tess??","tessssssssssssss"))
4. {n,m}?:擴展前一個字符n到m次,含m,最小匹配
print(re.findall(r"tes{1,2}","tessssssssssssss"))
print(re.findall(r"tesss{1,2}","tessssssssssssss"))
print(re.findall(r"tes{1,2}?","tessssssssssssss"))
print(re.findall(r"tesss{1,2}?","tessssssssssssss"))