1.正則表達(dá)式
re模塊是python中提供和正則表達(dá)式相關(guān)操作的方法
1)什么是正則表達(dá)式
正則表達(dá)式是用來(lái)描述字符串規(guī)律的一種語(yǔ)法,可以更加方便的解決字符串匹配局服、字符串查找状植、字符串切割等相關(guān)操作
2)正則語(yǔ)法(通用的)
re.fullmatch(正則表達(dá)式浊竟,字符串) - 判斷字符串和正則表達(dá)式是否完全匹配,如果不能匹配返回None
python是將正則表達(dá)式放在引號(hào)中
a.普通字符
如果正則表達(dá)式中出現(xiàn)普通字符津畸,那么這個(gè)字符表示這個(gè)字符本身
# 一個(gè)字符串只有一個(gè)字符振定,并且這個(gè)字符是a
re_str = r'a'
result = re.fullmatch(re_str, 'a')
print(result)
b. . - 匹配任意字符
一個(gè)正則表達(dá)式中的點(diǎn)匹配一個(gè)任意字符
# 一個(gè)字符串有三個(gè)字符,第一個(gè)是a肉拓,最后一個(gè)是b后频,中間是任意字符
re_str = r'a.b'
result = re.fullmatch(re_str, 'a1b')
print(result)
c.\w(了解) - 匹配字母、數(shù)字、下劃線
re_str = r'a\wb'
result = re.fullmatch(re_str, 'a_b')
print(result)
d.\s - 匹配空白字符
空白字符:空格卑惜、回車(\n)膏执、制表符(\t)
re_str = r'abc\s123'
result = re.fullmatch(re_str, 'abc 123')
print(result)
# print(re_str)
# print(r'1\n1')
e.\d - 匹配一個(gè)數(shù)字字符
re_str = r'\d\d\d'
result = re.fullmatch(re_str, '111')
print(result)
f.\W \S \D
\S - 匹配一個(gè)非空白字符
\D - 匹配一個(gè)非數(shù)字字符
re_str = r'a.b\Sc\D'
result = re.fullmatch(re_str, 'asb1c_')
print(result)
g.[字符集] - 匹配字符集中任意一個(gè)字符
注意:一個(gè)[]只能匹配一個(gè)字符
a.[字符集] - 匹配字符集中任意一個(gè)字符,例如:[abc123]露久、[12abc3] ->匹配一個(gè)字符是a或者b或者1或者c或者2或者3
b.[字符1-字符2] - 匹配編碼值在字符1編碼到字符2編碼中的所有字符中的任意一個(gè)(注意:字符1的編碼值必須小于字符2)
數(shù)字字符:[0-9]
小寫字母:[a-z]
大寫字母:[A-Z]
字母:[a-zA-Z]
\w:[a-zA-Z0-9]
中文:[\u4e00-\u9fa5]
例如:[2-8abc]
[0-9abc] -> [\dabc]
re_str = r'a[hello_?]b'
print(re.fullmatch(re_str, 'a?b'))
re_str = r'[a-w]12'
print(re.fullmatch(re_str, 'q12'))
re_str = r'[\dabc]123'
print(re.fullmatch(re_str, '2123'))
h.[^字符集] - 匹配不在字符集中的任意一個(gè)字符
非數(shù)字字符:[^0-9]
非小寫字母:[^a-z]
非字母:[^a-zA-Z]
非中文:[^\u4e00-\u9fa5]
print(re.fullmatch(r'[^123]ab', '4ab'))
3)檢測(cè)字符的符號(hào)
a.\b - 檢測(cè)是否是單詞邊界
單詞邊界 - 生活中凡是可以區(qū)分出兩個(gè)不同單詞的符號(hào)都是單詞邊界更米;空白字符、標(biāo)點(diǎn)符號(hào)等
# 匹配一個(gè)字符串長(zhǎng)度是6毫痕,字符分別是abc123征峦,并且要求c和1之間是單詞邊界
re_str = r'abc\b123'
print(re.fullmatch(re_str, 'abc 123'))
re_str = r'abc \b123'
print(re.fullmatch(re_str, 'abc 123'))
re_str = r'\d\d[a-f]\b'
print(re.fullmatch(re_str, '78d'))
b.\B - 檢測(cè)是否不是單詞邊界
print(re.search(r'\B\d\d\d\b', 'h789jkh890,kj'))
c.^ - 檢測(cè)是否是字符串開(kāi)頭(必須是在[]外面)
re_str = r'^123'
print(re.fullmatch(re_str, '123'))
d.$ - 檢測(cè)是否是字符串結(jié)尾(必須是在[]外面)
re_str = r'abc123$'
print(re.search(r'\d\d$', '哈哈哈67'))
2.正則表達(dá)式
1)控制匹配次數(shù)的符號(hào)
a.* - 匹配0次或多次
普通字符* - 普通字符出現(xiàn)0次或多次;r'a123' -> '123', 'aa123',...
\d - \d出現(xiàn)0次或多次镇草;'\dabc' -> 'abc', '223abc',...
[字符集] - [字符集]出現(xiàn)0次或多次;r'[abc]*123' -> 'a123', 'aab123',...
print(re.fullmatch(r'\d*abc', '165abc'))
b.+ - 匹配1次或多次
print(re.fullmatch(r'a+123', 'aa123'))
c.? - 匹配0次或1次
print(re.fullmatch(r'[-+]?\d\d\d', '-123'))
d.{}
{N} - 匹配N次
{M,N} - 匹配M到N次(至少M(fèi)次瘤旨,最多N次)
{M,} - 至少M(fèi)次
{,N} - 最多N次
print(re.fullmatch(r'a{3}', 'aaa'))
print(re.fullmatch(r'\d{3,5}abc', '2313abc'))
# 密碼:6-12的數(shù)字和字母
print(re.fullmatch(r'[\da-zA-Z]{6,12}', 'asjq182hk1'))
print(re.fullmatch(r'a{,3}123', 'aa123'))
2)貪婪和非貪婪
當(dāng)匹配次數(shù)不確定的時(shí)候梯啤,匹配分為貪婪和非貪婪;默認(rèn)都是貪婪的
貪婪 - 在匹配成功的前提下存哲,次數(shù)盡可能多的去匹配
非貪婪 - 在匹配成功的前提下因宇,次數(shù)盡可能少的去匹配(*?,+?,??,{M,N}?,{M,}?,{,N}?)
print(re.search(r'abc*', 'abcccc'))
print(re.search(r'abc*?', 'abccc'))
print(re.search(r'abc\d*', '哈哈哈abc1728311'))
print(re.search(r'abc\d*?', '哈哈哈abc1728311'))
3) | - 分之
正則1|正則2 - 匹配一個(gè)字符串滿足正則1或者正則2
# 寫一個(gè)正則要求匹配到的字符串是3個(gè)數(shù)字或者3個(gè)字母
print(re.fullmatch(r'\d{3}|[a-zA-Z]{3}', '291'))
4)() - 分組
a.做整體操作
re_str1 = r'(\d{3}|[A-Z]{2})abc'
print(re.fullmatch(re_str1, 'KJabc'))
b.重復(fù)內(nèi)容 - 正則中在數(shù)字前加\,用來(lái)重復(fù)前面第幾個(gè)分組匹配到的內(nèi)容(一個(gè)括號(hào)就是一個(gè)分組)
# '123abc123', '234abc234'
re_str2 = r'(\d{3})abc\1{2}'
print(re.fullmatch(re_str2, '000abc000000'))
5)轉(zhuǎn)義符號(hào)
a.轉(zhuǎn)義符號(hào)
指的是為了讓正則中有特殊意義的符號(hào)的意義消失祟偷,而在符號(hào)前加\
re_str3 = r'\d{2}\.\d{2}'
print(re.fullmatch(re_str3, '12.34'))
print(re.fullmatch(re_str3, '12=34')) # None
b.除了^方法放在[]的最開(kāi)頭察滑,-放在[]中兩個(gè)字符之間,其他單獨(dú)存在有特殊意義的符號(hào)在[]中都是普通字符
例如:+修肠,*贺辰,?,|,.,()等
re_str3 = r'\d{2}[.]\d{2}'
print(re.fullmatch(re_str3, '23=19')) # None
print(re.fullmatch(re_str3, '23.19'))
3.re模塊的使用
1)compile
compile(正則表達(dá)式) - 根據(jù)正則表達(dá)式創(chuàng)建正則對(duì)象
re_abj = re.compile(r'\d{2}')
re_abj.fullmatch('78')
re.fullmatch(r'\d{2}', '78')
2)匹配
fullmatch(正則表達(dá)式,字符串) - 完全匹配嵌施,讓整個(gè)字符串和正則表達(dá)式進(jìn)行匹配饲化,如果匹配成功返回匹配對(duì)象,否則返回None
match(正則表達(dá)式吗伤,字符串) - 匹配字符串開(kāi)頭吃靠。如果匹配成功返回匹配對(duì)象,否則返回None
re_str = r'\d{3}'
result1 = re.fullmatch(re_str, '879')
print(result1)
result2 = re.match(re_str, '123哈哈哈78')
print(result2)
匹配對(duì)象
result2 = re.match(r'(\d{3})([a-z])abc', '123wabc哈哈哈78')
a.獲取匹配結(jié)果(匹配到的子串)
匹配對(duì)象.group() - 獲取整個(gè)正則表達(dá)式匹配到的結(jié)果
匹配對(duì)象.group(N) - 獲取正則表達(dá)式中第N個(gè)分組匹配到的結(jié)果
print(result2.group()) # 123wabc
print(result2.group(1)) # 123
print(result2.group(2)) # w
b.獲取匹配結(jié)果在原字符串中的范圍 - 返回:(開(kāi)始下標(biāo)足淆,結(jié)束下標(biāo))巢块,結(jié)束下標(biāo)取不到
匹配對(duì)象.span() - 獲取整個(gè)正則表達(dá)式匹配結(jié)果在原字符串中的范圍
匹配對(duì)象.span(N) - 獲取指定分組匹配結(jié)果在原字符串中的范圍
print(result2.span(2)) # (3,4)
c.獲取原字符串
print(result2.string) # 123wabc哈哈哈78
3)查找
a.搜索
search(正則表達(dá)式,字符串) - 獲取字符串中第一個(gè)滿足正則表達(dá)式的子串巧号;如果有就返回匹配對(duì)象族奢,沒(méi)有返回None
print(re.search(r'\d{3}', 'hhh192hhh879jah'))
b.findall
findall(正則表達(dá)式,字符串) - 獲取字符串中所有滿足正則表達(dá)式的子串丹鸿,返回值是列表歹鱼,列表中的元素就是滿足要求的子串
print(re.findall(r'\d{3}', 'hhh123aka718821jh122')) # ['123', '718', '821', '122']
# 注意:如果finall中的正則表達(dá)式中有一個(gè)分組;返回列表中的元素只取匹配結(jié)果中分組對(duì)應(yīng)的部分
print(re.findall(r'(\d{3})[a-z]{2}', 'hhh123ak5a718821jh122')) # ['123', '821']
# 注意:如果正則表達(dá)式中有多個(gè)分組卜高,返回的列表中的元素是元組弥姻,元組中的元素是每個(gè)分組對(duì)應(yīng)的結(jié)果
print(re.findall(r'(\d{3})([a-z]{2})', 'hhh123ak5a718821jh122')) # [('123', 'ak'), ('821', 'jh')]
c.finditer
finditer(正則表達(dá)式南片,字符串) - 獲取字符串中所有滿足正則表達(dá)式的子串,返回值是迭代器庭敦,迭代器中的元素是匹配對(duì)象
result3 = re.finditer(r'(\d{3})([a-z]{2})', '213as===-891ja=181hj,,')
result3 = list(result3)
print(result3[0].group(1), result3[1].group(2))
4)切割
re.split(正則表達(dá)式疼进,字符串) - 將字符串中所有和正則表達(dá)式匹配的子串作為切割點(diǎn),對(duì)字符串進(jìn)行切割秧廉;返回值是列表
str1 = '假1設(shè)農(nóng)12安;回56復(fù)win,煎熬?jao ,a8h'
print(re.split(r'[,;!.?\s]', str1))
5)替換
re.sub(正則表達(dá)式伞广,字符串1,字符串2) - 將字符串2中所有滿足正則表達(dá)式的子串都替換成字符串1
print(re.sub(r'\d+', '+', str1)) # 假+設(shè)農(nóng)+安;回+復(fù)win,煎熬?jao ,a+h
# re.IGNORECASE 和 re.I - 表示匹配的時(shí)候忽略大小寫