01-正則表達(dá)式
正則表達(dá)式就是檢測(cè)字符串是否滿足某種規(guī)則的工具
例如:賬號(hào)是手機(jī)號(hào)/郵箱/多少位由什么東西組成的ect
1.正則語(yǔ)法
2.2.Python對(duì)正則表達(dá)式的支持,提供了一個(gè)內(nèi)置模塊:re
fullmatch(正則表達(dá)式,字符串):判斷字符串是否符合正則表達(dá)式的規(guī)則
- 匹配任意字符
匹配一個(gè)字符串爷绘,只有一個(gè)字符并且是任意字符
re_str = r'.'
result = fullmatch(re_str,'a')
print(result)
匹配一個(gè)字符串戏售,有兩個(gè)任意字符
re_str = r'..'
result = fullmatch(re_str,'an')
print(result)
匹配一個(gè)字符串,前三位分別是abc,最后一位是任意字符
re_str = r'abc.'
result = fullmatch(re_str,'abc@')
print(result)
- \w匹配字母數(shù)字下劃線
匹配一個(gè)前三分別是abc,最后一位是字母數(shù)字,下劃線其中的一種的字符串
re_str = r'abc\w'
result = fullmatch(re_str,'abc_')
print(result)
- \W匹配非字母數(shù)字下劃線
匹配一個(gè)前三分別是abc爵卒,最后一位非字母數(shù)字,下劃線的字符串
re_str = r'abc\W'
result = fullmatch(re_str,'abc_')
print(result)
- \s匹配空白字符(空白指空格撵彻、回車钓株、制表符等所有你能產(chǎn)生空白的字符)
匹配一個(gè)字符串,前三個(gè)是字母數(shù)字下劃線中的任意一種陌僵,最后一位是一個(gè)空白字符
re_str = r'\w\w\w\s'
result = fullmatch(re_str,'a1_\t')
print(result)
- \S匹配非空白字符(空白指空格轴合、回車、制表符等所有你能產(chǎn)生空白的字符)
匹配一個(gè)字符串碗短,前三個(gè)是字母數(shù)字下劃線中的任意一種受葛,最后一位非空白字符
re_str = r'\w\w\w\S'
result = fullmatch(re_str,'a1_9')
print(result)
- \d匹配一個(gè)數(shù)字字符
匹配一個(gè)字符串,前三位是數(shù)字字符,最后一位是任意字符
re_str = r'\d\d\d.'
result = fullmatch(re_str,'151h')
print(result)
- \D匹配一個(gè)非數(shù)字字符
匹配一個(gè)字符串总滩,前三位是非數(shù)字字符纲堵,最后一位是任意字符
re_str = r'\d\d\d.'
result = fullmatch(re_str,'acd1')
print(result)
- \b檢測(cè)是否是單詞邊界(單詞的開(kāi)頭 ,單詞的結(jié)尾闰渔、單詞和單詞之間的標(biāo)點(diǎn)席函,空格ect
注意:正則中遇到\b,匹配的時(shí)候先不管他冈涧,匹配成功后再回頭看\b的位置是不是邊界向挖。
匹配一個(gè)字符串,前四位是when第五位是空白炕舵,空白后邊是where,并且第四位n后面是單詞邊界
re_str = r'when\b\swhere'
result = fullmatch(re_str,'when where')
print(result)
- ^檢測(cè)字符串是否是以給定的正則表達(dá)式,匹配字符串的開(kāi)頭
re_str = r'\d\d\d.'
result = fullmatch(re_str,'151h')
print(result)
re_str = r'^m\d\d'
result = fullmatch(re_str,'m14')
print(result)
- $檢測(cè)字符串是否以給定的正則表達(dá)式結(jié)束
匹配一個(gè)字符串a(chǎn)數(shù)字跟畅,并且a數(shù)字是字符串的結(jié)尾
re_str = r'a\d$'
result = fullmatch(re_str,'a2')
print(result)
result = search(re_str,'a9aaa8')
print(result)
- \B檢測(cè)非單詞邊界
re_str = r'any\Bwhere'
result = fullmatch(re_str,'anywhere')
print(result)
- []匹配中括號(hào)出現(xiàn)的任意字符
注意:一個(gè)中括號(hào)只匹配一個(gè)字符
匹配一個(gè)三位的字符串咽筋,第一位是a或者b或者或者+,后面兩位是數(shù)字
re_str = r'[abc+]\d\d'
result = fullmatch(re_str,'+12')
print(result)
- -在正則表達(dá)式中的中括號(hào)中的應(yīng)用:如果將減號(hào)放到兩個(gè)字符的中間代表的是誰(shuí)到誰(shuí)徊件。如果想要表示'-'符號(hào)本身奸攻,就放到開(kāi)頭或者末尾
[1-8]代表的是:12345678
[-18]或者[18-]代表的是'1','-','8'
要求一個(gè)字符串中的第一位是1-8中的一個(gè),后面兩位是小寫(xiě)字母
re_str = r'[1-8][a-z][a-z]'
result = fullmatch(re_str,'1bg')
print(result)
re_str = r'[+!-][A-Z]'
result = fullmatch(re_str,'+A',)
result = fullmatch(re_str,'-B',)
result = fullmatch(re_str,'!C',)
print(result)
- [^字符集]匹配不在[]字符集中的任意一個(gè)字符
匹配一個(gè)四位的字符串虱痕,第一位不是大寫(xiě)字母也不是數(shù)字睹耐,后三位是abc
re_str = r'[^A-Z\d]abc'
result = fullmatch(re_str,'+abc')
print(result)
- 匹配0次或者多次
re_str = r'a*b' # 'b','ab','aab',.....以此類推
result = fullmatch(re_str,'aaaaaaaaaaab')
re_str = r'\d*'
re_str = r'[abc]*' # 'a','abbccbaababa',''
print(result)
- 匹配一次或者多次,與* 類似
判斷一個(gè)字符串是否是無(wú)符號(hào)的正整數(shù)
- 匹配一次或者多次,與* 類似
re_str = r'[1-9]+\d*'
result = fullmatch(re_str,'110')
print(result)
- 部翘? 匹配0次或者一次
re_str = r'@?\d+'
result = fullmatch(re_str,'@16723')
print(result)
- 判斷一個(gè)字符串是否是整數(shù)
re_str = r'[+-]?[0-9]\d*'
result = fullmatch(re_str,'0')
print(result)
- {N}匹配N次,就只有N位字符
re_str = r'\d{3}'
result = fullmatch(re_str,'123')
print(result)
- {N,} 至少匹配N次
re_str = r'\w{3,}'
result = fullmatch(re_str,'1234sda__')
print(result)
- {,N} 最多匹配N次
re_str = r'a{,2}b'
result = fullmatch(re_str,'b')
result = fullmatch(re_str,'ab')
result = fullmatch(re_str,'aab')
result = fullmatch(re_str,'aaab')
print(result)
- {M,N} 匹配至少M(fèi)次硝训,最多N次(M<N)
re_str = r'a{1,2}b'
result = fullmatch(re_str,'ab')
print(result)
注意:次數(shù)相關(guān)的操作,都是約束的次數(shù)符號(hào)前的一個(gè)字符
- | 分支(相當(dāng)于邏輯運(yùn)算中的or)
匹配一個(gè)字符串是三個(gè)字母新思,或者是三個(gè)數(shù)字
re_str = r'[A-Za-z]{3}|\d{3}'
re_str1 = r'\d{3}[A-Za-z]{3}|\d{3}'
# \d{3}[A-Za-z]當(dāng)做分支的一個(gè)整體的條件窖梁,|分支的左邊部分是一個(gè)整體,右邊是一個(gè)整體
result = fullmatch(re_str,'abg')
print(result)
正則中分支有短路操作:如果使用|去連接多個(gè)條件夹囚,前面的條件已經(jīng)符合纵刘,就不會(huì)使用后面的條件再去匹配了
練習(xí):寫(xiě)一個(gè)正則表達(dá)式,能夠匹配出字符串中所有的數(shù)字(包括整數(shù)和小數(shù))
# re_str = r'[1-9]\d*[.]?\d*|0[.]\d+'
# result = fullmatch(re_str,'0.12')
# print(result)
str1 = 'absx12.2ss2.03s40,60aas50,asd6.23,952asd'
re_str = r'[\d.]+'
# '\d+[.]\d+' 與'[1-9]\d*'的位置不同荸哟,輸出的結(jié)果也有可能不一樣
result = findall(re_str,str1)
print('======================')
print(result)
- 分組
通過(guò)加()來(lái)對(duì)正則條件進(jìn)行分組
兩位數(shù)字兩位字母出現(xiàn)三次
re_str = r'([a-z]{2}\d{2}){3}'
result = fullmatch(re_str,'as12df52er63')
print(result)
- 重復(fù)
可以通過(guò)\數(shù)字來(lái)重復(fù)匹配前面的括號(hào)中匹配的結(jié)果.數(shù)字的值代表前面的第幾個(gè)分組
re_str = r'(\d{2}[A-Z])=%\1\1'
result = fullmatch(re_str,'23B=%23B23B')
print(result)
re_str = r'(\d{2})\+(\w)\1{2}\2'
result = fullmatch(re_str,'12+a1212a')
print('++++++++++++++++++++')
print(result)
- 捕獲
按照完整的正則表達(dá)式去匹配假哎,只捕獲()中的內(nèi)容,只有在findall中有效
re_str = r'a(\d{3})b'
result = fullmatch(re_str,'a786b')
print(result)
print(findall(re_str,'a786b'))
# 用戶名由字母數(shù)字下劃線組成的6-20位
user= input('用戶名:')
QQ = input('qq:')
re_str = r'\w{6,20}'
result = fullmatch(re_str,user)
if result == None:
print('用戶名不合格鞍历,請(qǐng)重新輸入')
else:
print('用戶名:%s 合格'% user)
# QQ由數(shù)字組成并且第一位不能是0
re_str = r'[1,9]+\d{4,11}'
result = fullmatch(re_str,QQ)
if result == None:
print('用戶名不合格舵抹,請(qǐng)重新輸入')
else:
print('用戶名:%s 合格'% QQ)
02-正則中的轉(zhuǎn)義
1.正則表達(dá)式中的轉(zhuǎn)義和字符串中的轉(zhuǎn)義字符沒(méi)有任何關(guān)系,
在Python中的字符串前加r阻止的是字符串的轉(zhuǎn)義堰燎,不能阻止正則表達(dá)式的轉(zhuǎn)義
2.在正則表達(dá)式中掏父,可以通過(guò)在特殊意義的符號(hào)前加\來(lái)表示符號(hào)本身
+ . * ? \ ( ) [ ] ^ $ |
注意:
a. - 號(hào)只有在中括號(hào)中的兩個(gè)字符之間才有特殊的意義
b.如果特殊符號(hào)放到[]中,作為字符集的內(nèi)容秆剪,那么除了- 號(hào)在兩個(gè)字符之間以外赊淑,其他的都不需要轉(zhuǎn)義
c.\ 不管在哪都需要轉(zhuǎn)義爵政,^放到 中括號(hào)的最前需要轉(zhuǎn)義
re_str = r'a\+}'
result = fullmatch(re_str,'a\+')
print(result)
re_str = r'\+a'
result = fullmatch(re_str,'+a')
print(result)
re_str = r'\\w-a'
result = fullmatch(re_str,'\w-a')
print(result)
re_str = r'\(\d{3}'
result = fullmatch(re_str,'(234')
print(result)
re模塊
1.compile(正則表達(dá)式):將正則表達(dá)式轉(zhuǎn)換成正則表達(dá)式對(duì)象
re_str = r'\d+'
re_object = re.compile(re_str)
print(re_object)
# 不轉(zhuǎn)成對(duì)象,調(diào)用相應(yīng)的函數(shù)
re.match(re_str,'78hj')
# 轉(zhuǎn)換成對(duì)象陶缺,調(diào)用相應(yīng)的方法
re_object.fullmatch('78hj')
2.match(正則表達(dá)式钾挟,字符串)和fullmatch
判斷字符串的開(kāi)頭是否能夠和正則表達(dá)式匹配
fullmatch:判斷整個(gè)字符串是否能夠和正則表達(dá)式匹配
re_str = r'abc\d{3}'
result1 = re.match(re_str,'abc234dafdad')
result2 = re.fullmatch(re_str,'abc234')
print(result1)
print(result2)
# a.匹配范圍,匹配結(jié)果字符的下標(biāo)范圍:(起始下標(biāo),結(jié)束下標(biāo))---- 結(jié)束下標(biāo)取不到
print(result2.span())
# 獲取起點(diǎn)
print(result1.start())
# 獲取終點(diǎn)
print(result1.end())
注意:group參數(shù)饱岸,用來(lái)指定分組對(duì)應(yīng)的相應(yīng)的結(jié)果
re_str = r'(\d{3})\+([A-z]{3})'
match1 = re.match(re_str,'123+abcgg')
print(match1)
print(match1.span())
# 在匹配中掺出,獲取第一個(gè)分組的范圍
print(match1.span(1))
# 在匹配中,獲取第二個(gè)分組的范圍
print(match1.span(2))
# 在匹配結(jié)果中苫费,獲取第二個(gè)分組的起始下標(biāo)
print(match1.start(2))
# b.獲取匹配結(jié)果對(duì)應(yīng)的字符串
print(match1.group())
print(match1.group(1))
# c.獲取被匹配的原字符串
print(match1.string)
- search(正則表達(dá)式汤锨,字符串)
在字符串中去查找第一個(gè)滿足正則表達(dá)式的子串,如果找到就返回匹配對(duì)象百框,找不到返回None
search1 = re.search(r'\d+aa','he9aasda 78aadvsf world')
print(search1)
if search1:
print(search1.span())
練習(xí):使用search將一個(gè)字符串所有的數(shù)字字符串全部找到
’工資10000元闲礼,年齡18歲,身高180铐维,顏值100‘
str1 = '工資10000元柬泽,年齡18歲,身高180嫁蛇,顏值100'
re_str = r'[1-9]\d*'
search1 = re.search(re_str,str1)
while search1:
print(search1.group())
end = search1.end()
str1 = str1[end:]
search1 = re.search(re_str,str1)
- split(正則表達(dá)式锨并,字符串)
按滿足正則表達(dá)式的子串去切割字符串
str1 = '床前明月光,疑是地上霜睬棚。舉頭望明月第煮,低頭思故鄉(xiāng)!'
result = re.split(r'[,抑党。空盼,!]',str1)
result = re.split(r'\W',str1)
print(result)
中文也在\w的范圍內(nèi)
- sub(正則表達(dá)式新荤,替換字符串揽趾,被替換的字符串)
word = '你丫是傻叉嗎?我草擬大爺?shù)目凉牵現(xiàn)uck you'
result2 = re.sub(r'傻叉|草|大爺|Fuck|傻逼','*',word)
print(result2)
- findall(正則表達(dá)式篱瞎,字符串)
# 獲取字符串中所有滿足正則表達(dá)式的子串
# 返回值是列表
# 注意:分組中的捕獲效果在這兒有效
result = re.findall(r'\d([a-z])+','數(shù)據(jù)的恐怖殘5and,125name按貸款')
# 取的字符串是正則表達(dá)式最后一個(gè)字符
result1 = re.findall(r'\d([a-z]+)','數(shù)據(jù)的恐怖殘5and,125name按貸款')
# 取的字符串是正則表達(dá)式中的后一個(gè)分組
print(result)
print(result1)