Python中正則表示式介紹
正則
正則表通常是用來檢索、替換那些符合某個模式(規則)的文字。也就是說使用正則表示式可以在字串中匹配出你需要的字元或者字串,甚至可以替換你不需要的字元或者字串。
正則(不是python特有的) 匹配字串,其他語言也有正則表示式
例項:
需求:輸入字元,判斷字串有無python
import re
a=input("輸入:")
b=re.search("python",a)#搜尋匹配,匹配是第一個
if bool(b) ==True:
print("ok")
else:
print("no")
需求:輸入字元,判斷字串是否是5-11位數字
qq=input("輸入:")
b=re.search("[0-9]{5,11}",qq) #(規則,物件)
if b:
print("ok")
else:
print("no")
'''
元字元
常用特殊字元:
. ^ $ * + ? {} [] \ | ()
大多數字母和字元會匹配它們自身,有少數特殊字元我們稱為元字元,它們不能匹配自身
子組匹配和模式重複次數等
. 匹配除換行符之外的所有的字元
>>> re.search(".","\nasfsdfdsaf") #去掉了\n
<_sre.SRE_Match object; span=(1, 2), match='a'>
\d 匹配0~9的數字
>>> re.search("\d","asf2sdfdsaf") #查詢第一個數字
<_sre.SRE_Match object; span=(3, 4), match='2'>
>>> re.findall("\d","asf2sdf4dsa3f") #查詢所有的
['2', '4', '3']
\s # 匹配任意的空白符,包括空格,製表符(Tab),換行符等
>>> re.findall("\s","\n \t asss")
['\n', ' ', ' ', '\t', ' ', ' ']
\w 匹配字母或數字或下劃線或漢字等
>>> re.findall("\w","adwo__55+%?")
['a', 'd', 'w', 'o', '_', '_', '5', '5']
\b 表示單詞的邊界 #除了字母下劃線和數字外,其他都算邊界
>>> re.findall(r"\bapple\b","apple apple") # r轉義
['apple', 'apple']
\. 表示匹配點號本身
>>> re.findall(r"\.",".apple. apple")
['.', '.']
python正則表示式關鍵字字元轉義
re.findall(r"\\b",r"55apple\b") #正則表達轉義 ,需要加上r 和\
\D、\S、\W、\B 是與小寫的相反的作用
\D
>>> re.findall(r"\D","123ASDF")
['A', 'S', 'D', 'F']
\S
>>> re.findall(r"\S","\t \n aaa")
['a', 'a', 'a']
\W
>>> re.findall(r"\W","\t \n aaa")
['\t', ' ', '\n', ' ']
^ 脫字元,匹配輸入字串的開始的位置
>>> re.findall(r"^adc","adcefg") #adc開頭的
['adc']
$ 匹配輸入字串的結束位置,解除元字元的特殊功能例
>>> re.findall(r"efg$","adcefg") #efg結尾的
['efg']
匹配次數
{M,N} M和N 為非負整數,其中M<=N 表示前面的匹配M~N次
>>> re.findall(r"\d{1,3}","22db44ef555g1666")
['22', '44', '555', '166', '6']
{M,} 表示需要匹配M次 以上
>>> re.findall(r"\d{2,}","22db44ef555g1666")
['22', '44', '555', '1666']
{,N} 等價於{0~N}
>>> re.findall(r"\d{,2}","22db44ef555g1666") #注意這裡最後會加上一個空格
['22', '', '', '44', '', '', '55', '5', '', '16', '66', '']
{N} 表示需要匹配N次
>>> re.findall(r"\d{2}","22db44ef555g1666")
['22', '44', '55', '16', '66']
* 匹配前面的子表示式零次或多次,等價於{0,}
>>> re.findall(r"\d*","22db44ef555g1666")
['22', '', '', '44', '', '', '555', '', '1666', '']
+ 匹配前面的子表示式一次或多次,等價於{1,}
>>> re.findall(r"\d+","22db44ef555g1666")
['22', '44', '555', '1666']
? 匹配前面的子表示式零次或一次,等價於{0,1}
注:*?、+?、{n,m}?貪婪與懶惰
>>> re.findall(r"\d?","22db44ef555g1666")
['2', '2', '', '', '4', '4', '', '', '5', '5', '5', '', '1', '6', '6', '6', '']
>>> re.findall(r"\d*?","22db44ef555g1666") # *是 0到多次 ?號是0到1次 結果就是匹配0次 求交集
['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
>>> re.findall(r"\d+?","22db44ef555g1666") #+號是1到多次 ?號是0到1次 結果就是1次 求交集
['2', '2', '4', '4', '5', '5', '5', '1', '6', '6', '6']
>>> re.findall(r"\d{2,5}?","22db44ef555g1666") #{2,5}是2到5次 ?號是0到1次 最小取值是2次
['22', '44', '55', '16', '66']
子組匹配
[ ] 字元類,將要匹配的一類字符集放在[]裡面
[ . ? * ( ) {} ] 匹配裡面的這些符號
[0-9] 匹配0到9的數字相當於\d
需求:所有數字
>>> re.findall(r"[0-9]","22db44ef5") #所有數字
['2', '2', '4', '4', '5']
[^\d] 匹配除數字以外的字元,相當於\D
>>> re.findall(r"[^\d]","22db44ef5AB")
['d', 'b', 'e', 'f', 'A', 'B']
>>> re.findall(r"[^\d]{2}","22db44ef5AB") #非數字次數為2的
['db', 'ef', 'AB']
[a-z] 匹配所有的小寫字母
>>> re.findall(r"[a-zA-Z]","22db44ef5AB") #所有字母
['d', 'b', 'e', 'f', 'A', 'B']
[^a-z] # 匹配非小寫字母
>>> re.findall(r"[^a-z]{2}","22db44ef5AB")
['22', '44', '5A']
| 相當於或(or)分支條件
A | B 匹配字母A或者B 與[AB]是一樣的
第一種方式:
>>> re.findall(r"b|a","22db44ef5ABa")
['b', 'a']
第二種方式:
>>> re.findall(r"[ba]","22db44ef5ABa")
['b', 'a']
() 分組,將要匹配的一類字符集放在()組成一個小組
>>> re.findall(r"(db)","22db44ef5ABa")
['db']
>>> re.findall(r"(db)*","22db44ef5ABadb")
['', '', 'db', '', '', '', '', '', '', '', '', 'db', '']
re模組
re模組的常用方法
re.compile() 編譯正則表示式為模式物件
>>> re.compile(r"\d")
re.compile('\\d')
match() 判斷一個正則表示式是否從開始處匹配字串
>>> print(re.match(r"\d","b123a")) #匹配開頭,相當於脫字元
None
search() 遍歷字串,找到正則表示式匹配的第一個位置
findall() 遍歷字串,找到正則表示式匹配的所有位置並以列表的形式返回
sub() 替換 類似於字串中 replace() 方法
>>> re.sub("i","o","pythin") #預設替換所有
'python'
>>> re.sub("i","o","pythin pythin pythin pythin",3) #指定次數
'python python python pythin'
檢視匹配物件中的資訊
group() 返回匹配到的字串
star() 返回匹配的開始位置
end() 返回匹配的結束位置
span() 返回一個元組表示匹配位置(開始,結束)
>>> c=re.search(r"\d","b35f3")
>>> c.group()
'3'
>>> c.start()
1
>>> c.end()
2
>>> c.span()
(1, 2)