一、正則表達(dá)式
正則表達(dá)式就是用來檢測(cè)字符串是否滿足某種規(guī)則的工具
例如:
- a.賬號(hào)是手機(jī)號(hào)/郵箱/多少位由什么東西組成
- b.臟話替換成*等....
1.正則語(yǔ)法
2.python對(duì)正則表達(dá)式的支持彼乌,提供了內(nèi)置模塊:re
fullmatch(正則表達(dá)式,字符串):判斷整個(gè)字符串是否符合正則表達(dá)式規(guī)則
1.匹配字符
1) ' . ' 匹配任意字符
# 匹配一個(gè)字符串,前三位分別是abc,最后一位是任意字符
re_str = r'abc.'
result = fullmatch(re_str, 'abc&')
print(result)
2)'\w'匹配字母數(shù)字下劃線
# 匹配一個(gè)字符串,前三位是分別是abc巨柒,最后兩位是字母數(shù)字下劃線
re_str = r'abc\w\w'
result = fullmatch(re_str, 'abc_0')
print(result)
3)'\s'匹配空白字符(空白指空格智嚷、制表符、和回車等所有產(chǎn)生空白的字符)
re_str = r'\w\w\w\s.'
result = fullmatch(re_str, 'a_0 !')
print(result)
4)'\d'匹配一個(gè)數(shù)字字符
# 匹配一個(gè)字符串评姨,前三位是數(shù)字字符,最后一位是任意字符
re_str = r'\d\d\d.'
result = fullmatch(re_str, '202*')
print(result)
5)'\b'檢測(cè)是否是單詞邊界檢測(cè)(單詞的開頭、單詞的結(jié)尾吐句、單詞和單詞之間的標(biāo)點(diǎn)空格等)
# good good study,day day up!
# 注意:正則中遇到\b胁后,匹配的時(shí)候先不管它,匹配成功后再回來看\b的位置是否是個(gè)單詞邊界
# 匹配一個(gè)字符串嗦枢,前四位是when攀芯,第五位是空白,空白后面是where文虏,并且第四位n后面是個(gè)單詞邊界
re_str = r'when\b.where'
result = fullmatch(re_str, 'when,where')
print(result)
6)'^'檢測(cè)字符串是否以給定的正則表達(dá)式開頭
# 匹配一個(gè)字符串侣诺,是否以兩個(gè)數(shù)字符開頭
re_str = r'^\d\d'
result = fullmatch(re_str, '23')
print(result)
7)'$'檢測(cè)字符串是否以給定的正則表達(dá)式結(jié)尾
# 匹配一個(gè)字符串"a數(shù)字",并且"a數(shù)字"的字符串的結(jié)尾
re_str = r'a\d$'
result = fullmatch(re_str, 'a8')
print(result)
8)'\W'匹配一個(gè)非數(shù)字氧秘、字母年鸳、下劃線
9)'\S'匹配非空字符串
10)'\D'匹配非數(shù)字字符
11)'\B'檢測(cè)非單詞邊界
2.匹配次數(shù)
1')[ ]'匹配中括號(hào)中出現(xiàn)的任意字符
# 注意:一個(gè)中括號(hào)只匹配一個(gè)字符
# 匹配一個(gè)3位的字符串,第一位是a或者b或者c丸相,后兩位是數(shù)字
re_str = r'[abc]\d\d'
result = fullmatch(re_str, 'a12')
print(result)
' - '在正則中的中括號(hào)的應(yīng)用:如果將減號(hào)方法兩個(gè)字符的中間代表的是誰(shuí)到誰(shuí)搔确。如果想要表示' - '符號(hào)本身,就放在開頭或結(jié)尾
# 要求一個(gè)字符串中的第一個(gè)是1-8中的一個(gè)灭忠,后面兩位是小寫字母
# [-1-8]:代表字符集是:-12345678
# [-18]或者[18-]:代表的字符集是'1','8','-'
re_str = r'[-1-8][a-z][a-z]'
result = fullmatch(re_str, '-mn')
print(result)
2)[^字符集]匹配不在[]字符集中的任何一個(gè)字符
# 匹配一個(gè)四位的字符串膳算,第一位不是大寫字母或數(shù)字,后三位是abc
re_str = r'[^A-Z\d]abc'
result = fullmatch(re_str, '!abc')
print(result)
3)' * '匹配0次或者多次
# 匹配一個(gè)字符串弛作,最后一位是b涕蜂,b前面有0個(gè)或者多個(gè)a
re_str = r'a*b' # 'b','ab','aab','aaab'...
result = fullmatch(re_str, 'b')
print(result)
re_str = r'\d*'
re_str = r'[abc]*'
4)' + '匹配一次或者多次(至少一次)
# 判斷一個(gè)字符串是否是無符號(hào)的正整數(shù)
re_str = r'[1-9]+\d*'
print(fullmatch(re_str, '1010'))
5)' ? '匹配0次或者一次
# 判斷一個(gè)字符串是否是整數(shù)
re_str = r'[-+]?[1-9]+\d*'
print(fullmatch(re_str, '-100'))
6)
{N}匹配N次
{N,}至少匹配N次
{,N}最多匹配N次
{M,N} 匹配至少M(fèi)次,最多N次(N>M)
3.分支和分組
1)' | '分支(相當(dāng)于邏輯運(yùn)算中的or)
# \d{3}[a-z]{2}是分支的第一個(gè)條件缆蝉,{A-Z}{3}是分支的第二個(gè)條件
re_str = r'\d{3}[a-z]{2}|[A-Z]{3}'
print(fullmatch(re_str, 'ABC'))
注意:正則中的分支有短路操作宇葱,如果使用|
連接多個(gè)條件,前面的條件已經(jīng)匹配出結(jié)果刊头,那么就不會(huì)使用后面的條件再去匹配了
2)分組
a.分組
通過加()來對(duì)正則條件進(jìn)行分組
# 兩位數(shù)字兩位字母出現(xiàn)3次
re_str = r'(\d{2}[a-z]{2}){3}'
print(fullmatch(re_str, '11aa22bb33cc'))
b.重復(fù)
可以通過\數(shù)字
來重復(fù)匹配前面的括號(hào)中匹配的結(jié)果
re_str = r'(\d{2})-(\w{2})\1{2}\2'
print(fullmatch(re_str, '12-a_1212a_'))
c.捕獲
按照完整的正則表達(dá)式去匹配黍瞧,只捕獲()中的內(nèi)容,只有在findall中有效
re_str = r'a(\d{2})b'
print(findall(re_str, 'a78b'))
['78']
二原杂、正則中的轉(zhuǎn)義
正則表達(dá)式中的轉(zhuǎn)義和字符串中的轉(zhuǎn)義字符沒有任何關(guān)系印颤。在python中的字符串前加r
阻止的是字符串的轉(zhuǎn)義,不能阻止正則表達(dá)式的轉(zhuǎn)義
在正則表達(dá)式中穿肄,可以通過在有特殊意義的符號(hào)前加\
來表示符號(hào)本身
\+ \. \* \? \\ \( \) \[ \] \^ \$ \|
注意:
a.-
號(hào)只有在中括號(hào)中的兩個(gè)字符之間才有特殊的意義
b.如果特殊符號(hào)放在[]
中作為字符集的內(nèi)容年局,那么除了-
號(hào)在兩個(gè)字符之間以外,其他的都不需要轉(zhuǎn)義
c.\
不管在哪都需要轉(zhuǎn)義
三咸产、re模塊
1.compile(正則表達(dá)式):將正則表達(dá)式轉(zhuǎn)換成正則表達(dá)式對(duì)象
re_str = r'\d+'
re_object = re.compile(re_str)
# 不轉(zhuǎn)成對(duì)象矢否,調(diào)用相應(yīng)的函數(shù)
re.match(re_str, '78s')
# 轉(zhuǎn)換成對(duì)象,調(diào)用相應(yīng)的方法
re_object.match('78r')
2.match(正則表達(dá)式,字符串)和fullmatch
# match:判斷字符串的開頭是否能夠和正則表達(dá)式匹配
# fullmatch:判斷整個(gè)字符串是否能夠和正則表達(dá)式匹配
# 返回值都是匹配結(jié)果脑溢,如果匹配成功返回匹配對(duì)象僵朗,否則返回None
re_str = r'abc\d{3}'
match1 = re.match(re_str, 'abc123abcdef')
match2 = re.fullmatch(re_str, 'abc123')
print(match1)
print(match2)
a.匹配到的范圍。匹配結(jié)果字符的下標(biāo)范圍
print(match1.span())
# 獲取起點(diǎn)
print(match1.start())
# 獲取終點(diǎn)
print(match1.end())
# 注意:group參數(shù),用來指定分組對(duì)應(yīng)的相應(yīng)的結(jié)果
re_str = r'(\d{3})\+([a-z]{2})'
match1 = re.match(re_str, '123+ab123')
print(match1.span())
print(match1.span(1))
print(match1.span(2))
# 在匹配結(jié)果中验庙,獲取第2個(gè)分組的起始下標(biāo)
print(match1.start(2))
b.獲取匹配結(jié)果對(duì)應(yīng)的字符串
re_str = r'(\d{3})\+([a-z]{2})'
match1 = re.match(re_str, '123+ab123')
print(match1.group())
print(match1.group(1))
print(match1.group(2))
123+ab
123
ab
c.獲取被匹配的原字符
re_str = r'(\d{3})\+([a-z]{2})'
match1 = re.match(re_str, '123+ab123')
print(match1.string)
123+ab123
3.search(正則表達(dá)式,字符串):
在字符串中去查找第一個(gè)滿足正則表達(dá)式要求的子串顶吮,如果找到了就返回匹配對(duì)象,否則返回None
search1 = re.search(r'\d+aa', 'hel11aalo wo3aarpld')
print(search1)
if search1:
print(search1.span())
<_sre.SRE_Match object; span=(3, 7), match='11aa'>
(3, 7)
4.split(正則表達(dá)式,字符串)
按滿足正則表達(dá)式的子串去切割字符串
str1 = '窗前明月光粪薛,疑是地上霜悴了。舉頭望明月,低頭思故鄉(xiāng)违寿!'
result = re.split(r'\W',str1) # 中文屬于\w范圍
print(result)
['窗前明月光', '疑是地上霜', '舉頭望明月', '低頭思故鄉(xiāng)', '']
5.sub(正則表達(dá)式,替換字符串,被替換字符串)
word = '你是SB嗎湃交,操你大爺?shù)模現(xiàn)uck you'
result = re.sub(r'SB|操|(zhì)Fuck','*',word)
print(result)
你是*嗎陨界,*你大爺?shù)模? you
6.findall(正則表達(dá)式,字符串)
獲取字符串中所有滿足正則表達(dá)式的子串
返回值是列表
注意:分組中的捕獲效果在這兒有效
result = re.findall(r'\d([a-z]+)','北京1beijing,歡迎welcome你2you')
print(result)
['beijing', 'you']