什么是貪婪
在正則中控制匹配不確定次數(shù)的后面可以加 ?,來(lái)表示盡可能少的匹配
在貪婪的時(shí)候,匹配是盡可能多的匹配。
注意:盡可能少是在能夠匹配到的前提下,盡可能少
*? +? ?? {M,N}? 后面加問(wèn)號(hào)盡可能少的匹配
def main():
re_str = r'\d+'
print(re.search(re_str,'asdfsadf34557645==asd')) #全部數(shù)字,盡可能多的
re_str = r'\d+?'
print(re.search(re_str,'asdfsadf34557645==asd')) #只有一個(gè)3
if __name__ == '__main__':
main()
re模塊
def main():
- compile(正則表達(dá)式) -->將正則表達(dá)式轉(zhuǎn)換成正則對(duì)象
編譯后可以直接通過(guò)對(duì)象調(diào)用相關(guān)的對(duì)象方法
re22 = re.compile(r'\d{3}') # re.compile('\\d{3}')
re22.fullmatch('234')
- fullmatch(正則表達(dá)式,字符串) ---> 讓字符串和正則表達(dá)式完全匹配,匹配成功返回匹配對(duì)象,失敗返回None
應(yīng)用:檢測(cè)字符串內(nèi)容是否符合要求,例如:帳號(hào)、密碼、判斷手機(jī)號(hào)身份證號(hào)
result = re.fullmatch(r'(\d{3})=(q*?)', '234=qq')
print(result)
匹配對(duì)象
1。span - 匹配到的字符串在原字符串中的下標(biāo)范圍(結(jié)果是元組)
print(result.span()) #獲取整個(gè)正則表達(dá)式匹配到的內(nèi)容的范圍
- start和end - 匹配到的字符串在原字符串中的開(kāi)始下標(biāo)和結(jié)束下標(biāo)
print(result.start(),result.end())
result.span(1) # 獲取正則表達(dá)式中第一個(gè)分組匹配到的內(nèi)容的范圍(如果沒(méi)有分組分報(bào)錯(cuò))
print(result.start(1), result.start(2)) #第一個(gè)分組的開(kāi)始下標(biāo),第二個(gè)分組的開(kāi)始下標(biāo)
- group() - 獲取匹配到的字符串(結(jié)果是字符串)
print(result.group()) #獲取整個(gè)正則匹配到的字符串
print(result.group(1)) #獲取第一個(gè)分組匹配到的字符串
print(result.groups()) #同時(shí)獲取所有分組匹配到的字符串(結(jié)果是元組)
- string - 獲取原字符串
print(result.string)
- match(正則表達(dá)式,字符串) -> 用字符串開(kāi)頭和正則表達(dá)式匹配(結(jié)果匹配對(duì)象,匹配失敗None)
print(re.match(r'\D\d','s2123wqed'))
- search(正則表達(dá)式,字符串) -->在字符串中去匹配出第一個(gè)字符符合正則表達(dá)式的子串,匹配成功結(jié)果是匹配對(duì)象,失敗返回None
print(re.search(r'[\u4e00-\u9fa5]{3}','s2白龍123花非花wqed'))
- split(正則表達(dá)式,字符串) -->將字符串按照滿足正則要求的子串進(jìn)行切割(返回值是列表)
print(re.split(r'\d+','asdf2134asdf5645dasd12dsaa'))
# ['asdf', 'asdf', 'dasd', 'dsaa']
- sub(正則表達(dá)式,新字符串1,原字符串2) --> 在原字符串2中查找能夠和正則表達(dá)式匹配的子串替換成新字符串1,產(chǎn)生一個(gè)新的字符串
print(re.sub(r'\d','*','123sadqewqewr5454aasdasd')) #區(qū)配所有數(shù)字,每個(gè)數(shù)字替換成一個(gè)*。
print(re.sub(r'傻逼|傻','*','你是傻逼嗎?')) #長(zhǎng)字符放前面,單獨(dú)一個(gè)字的放在后面。。分之是從第一個(gè)開(kāi)始匹配
print(re.sub(r'傻逼|傻[插狗艸]', '*', '你是傻逼嗎?')) #[]里任意一個(gè)字和前面組合也會(huì)被替換
- findall(正則表達(dá)式,字符串) --> 在字符串中獲取滿足正則表達(dá)式的所有的子串(結(jié)果是列表)
注意:如果正則表達(dá)式中有分組,直接獲取到的是分組中匹配到的內(nèi)容。。如果有多個(gè)分組,列表中的元素是元組。(每個(gè)分組單獨(dú)一個(gè)元素)
print(re.findall(r'\d+','132adq6556eqew12sd'))
print(re.findall(r'(\d+)[a-z]', '132adq6556eqew12sd')) #['132', '6556', '12']
print(re.findall(r'(\d+)([a-z])', '132adq6556eqew12sd')) #[('132', 'a'), ('6556', 'e'), ('12', 's')]
- finditer(正則表達(dá)式,字符串) -->在字符串中獲取滿足正則表達(dá)式的所有的子串(結(jié)果是迭代器,元素是匹配對(duì)象)
result = re.finditer(r'\d+','132adq6556eqew12sd')
print(next(result).group())
- re.I -->忽略大小寫(xiě)
匹配的約束條件是放在函數(shù)的flags參數(shù)位置
print(re.fullmatch(r'[a-z]{2}','AS',re.I))
用戶名字母,數(shù)字下滑線 6-20 ,QQ號(hào)5-12位,首位不能是0
re.fullmatch(r'[a-zA-Z\b_]{6,20}','asdfqweasdf')
re.fullmatch(r'[1-9]\d{4,11}', '12354')
if __name__ == '__main__':
main()