正則表達(dá)式:用來查找稼锅、匹配葵第、切割字符串的工具
Python對(duì)正則表達(dá)式的支持:re模塊(Python內(nèi)置模塊)
re模塊包含字符串匹配、查找、切割等相關(guān)方法
fullmatch(正則表達(dá)式,需要匹配的功能):用正則表達(dá)式來和字符串進(jìn)行匹配,看是佛能夠匹配成功
fullmatch:完全匹配骚揍,從字符串開頭到結(jié)尾
match:從開始往后匹配,如果可以匹配成功啰挪,則字符串后面的不再匹配
正則表達(dá)式:是一個(gè)符合正則規(guī)范的字符串
import re
if __name__ == '__main__':
#1. .:匹配一個(gè)任意字符
# re_str =r'.' 一個(gè)字符
# re_str = r'a.'第一個(gè)是a信不,第二個(gè)任意字符
# r--->正則表達(dá)式的字符串前面一般加'r'來阻止轉(zhuǎn)義,因?yàn)檎齽t表達(dá)式的符號(hào)中有很多帶'\'的符號(hào),表示特殊的意義
re_str = r'..'
print(re.fullmatch(re_str,'ab'))
# re_str = 'ab'那只能匹配ab字符串
# 2.\w --->匹配一個(gè)字符是字母亡呵、數(shù)字抽活、或者下劃線
re_str =r'\w'
# re_str = r'\w..' 第一個(gè)是字母數(shù)字下劃線,后兩個(gè)任意字符
# re_str = r'\w\w' 2個(gè)數(shù)字锰什、字母下硕、下劃線
print(re.fullmatch(re_str,'_'))
# 3.\s 匹配1個(gè)空白字符(空格、tab(\t)汁胆、回車(\n))
re_str = r'\s'
# re_str = r'a\sb' 匹配第一個(gè)字符是a,第二個(gè)是空白,最后是b的字符串
# print(re.fullmatch(re_str,'a\nb'))
print(re.fullmatch(re_str,'\t'))
# 4.\d 匹配1個(gè)數(shù)字字符
re_str = r'\d'
# re_str = r'\d\d\d'匹配三個(gè)數(shù)字的字符串
# print(re.fullmatch(re_str,'123'))
print(re.fullmatch(re_str,'1'))
# 5.\b 檢測單詞的邊界(字符串結(jié)束梭姓,字符串開頭,單詞邊界)
# 三個(gè)任意字符的前面和后面都是單詞邊界的字符串
# re_str = r'\b...'
# print(re.match(re_str,'123346'))
# print(re.match(re_str,'123'))
re_str = r'\bjsg'
print(re.match(re_str,'jsg,abc1'))
# 6. ^匹配字符串以什么開始
re_str = r'^ss...'
print(re.fullmatch(re_str,'ssaaa'))
#匹配無意義,查找時(shí)使用嫩码,因?yàn)閒ullmatch就是從開始到結(jié)束匹配
print(re.findall(r'^ada','ada123 ada456'))
# 7. $檢測字符串結(jié)束
re_str = r'.abc$'
print(re.fullmatch(re_str,'1abc'))
re_str = r'....abc$'
print(re.fullmatch(re_str,'a122abc'))
# 8.\W 匹配非字母誉尖、數(shù)字、下劃線
re_str = r'\W\w'
print(re.fullmatch(re_str,'*2'))
# 9.\S 匹配非空白字符
re_str = r'\S\s'
print(re.fullmatch(re_str,'*\n'))
# 10.\D 匹配非數(shù)字
re_str = r'\D\d'
print(re.fullmatch(re_str,'*1'))
# 11.\B 檢測非邊界
# \B不能放在fullmatch字符串的前后和match的前面铸题,可以放在中間铡恕,或match的后面
re_str = r'ab\Bc'
# 檢測ab的后面不是邊界,c的前面不是邊界
print(re.fullmatch(re_str,'abc'))
print(re.match(re_str,'abc'))
<_sre.SRE_Match object; span=(0, 2), match='ab'>
<_sre.SRE_Match object; span=(0, 1), match='_'>
<_sre.SRE_Match object; span=(0, 1), match='\t'>
<_sre.SRE_Match object; span=(0, 1), match='1'>
<_sre.SRE_Match object; span=(0, 3), match='jsg'>
<_sre.SRE_Match object; span=(0, 5), match='ssaaa'>
['ada']
<_sre.SRE_Match object; span=(0, 4), match='1abc'>
<_sre.SRE_Match object; span=(0, 7), match='a122abc'>
<_sre.SRE_Match object; span=(0, 2), match='*2'>
<_sre.SRE_Match object; span=(0, 2), match='*\n'>
<_sre.SRE_Match object; span=(0, 2), match='*1'>
<_sre.SRE_Match object; span=(0, 3), match='abc'>
<_sre.SRE_Match object; span=(0, 3), match='abc'>
import re
if __name__ == '__main__':
# 1.[] 匹配[]中出現(xiàn)的任意一個(gè)字符丢间。
# 匹配字符串前三位是abc開始探熔,第4位是1或者q
re_str = r'abc[1q].'
print(re.fullmatch(re_str,'abc12'))
print(re.fullmatch(re_str, 'abcq1'))
# 2.[^]匹配不再[]中出現(xiàn)的任意一個(gè)字符
# 匹配一個(gè)字符串,前三位是acc第4位不是123的字符串
# re_str = r'acc[^123]'
re_str = r'acc[^\da]'
print(re.fullmatch(re_str,'accb'))
# [0-9]匹配0-9的任意一個(gè)數(shù)字
# [a-z]匹配小寫字母
# [A-Z]匹配大寫字母
# [a-zA-z]匹配所有字母
# re_str = r'[-a-zA-Z]\w*' 標(biāo)識(shí)符
# 3.*匹配0次或者多次
re_str = r'\d*abc'
print(re.fullmatch(re_str,'abc'))
print(re.fullmatch(re_str,'1abc'))
print(re.fullmatch(re_str,'123abc'))
# 4.+:匹配一次或多次
re_str = r'\d+a*'
#至少一次數(shù)字,+至少0次字母
print(re.fullmatch(re_str,'111aa'))
print(re.fullmatch(re_str,'22aa'))
# 5.?:匹配0次或者1次
re_str = r'[a-z]?123'
print(re.fullmatch(re_str,'123'))
print(re.fullmatch(re_str,'s123'))
# re_str =r'[1-9]\d*'
# re_str =r'\+?[1-9]\d*'
# re_str =r'[+]?[1-9]\d*'
# 6.{N} 匹配N次
# re_str =r'\d{5}abc'
print(re.fullmatch(re_str,'12345abc'))
# 7.{M,}至少匹配M次 >=M次
re_str = r'\d{3,}\w*'
print(re.fullmatch(re_str,'123abc'))
print(re.fullmatch(re_str, '1223abcd'))
# 8.{M,N}匹配次數(shù) M<=次數(shù)<=N
re_str =r'\d{8,16}'
print(re.fullmatch(re_str,'12345678'))
re_str = r'[\da-zA-z]{8,16}'
# 9.| 分支
# 匹配三個(gè)數(shù)字或者三個(gè)小寫字母
re_str = r'\d{3}|[a-z]{3}'
print(re.fullmatch(re_str,'123'))
# 10.()匹配的時(shí)候是分組千劈,讓括號(hào)中的正則條件變成一個(gè)整體
# 匹配一個(gè)字符串祭刚,a1整體重復(fù)3次
re_str = r'(a1){3}'
print(re.fullmatch(re_str,'a1a1a1'))
#=====================================
#11.*?重復(fù)1次或多次墙牌,盡可能少的重復(fù)
re_str = r'a*?'
print(re.match(re_str,'aaaaa'))
#12.??重復(fù)0次或者1次,盡可能少的重復(fù)
re_str = r'b??'
#13.{M,N}? 重復(fù)M-N范圍暗甥,0次或1次喜滨,盡可能少的重復(fù)
#14.{N,}?重復(fù)至少N次,盡可能少的重復(fù)
<_sre.SRE_Match object; span=(0, 5), match='abc12'>
<_sre.SRE_Match object; span=(0, 5), match='abcq1'>
<_sre.SRE_Match object; span=(0, 4), match='accb'>
<_sre.SRE_Match object; span=(0, 3), match='abc'>
<_sre.SRE_Match object; span=(0, 4), match='1abc'>
<_sre.SRE_Match object; span=(0, 6), match='123abc'>
<_sre.SRE_Match object; span=(0, 5), match='111aa'>
<_sre.SRE_Match object; span=(0, 4), match='22aa'>
<_sre.SRE_Match object; span=(0, 3), match='123'>
<_sre.SRE_Match object; span=(0, 4), match='s123'>
None
<_sre.SRE_Match object; span=(0, 6), match='123abc'>
<_sre.SRE_Match object; span=(0, 8), match='1223abcd'>
<_sre.SRE_Match object; span=(0, 8), match='12345678'>
<_sre.SRE_Match object; span=(0, 3), match='123'>
<_sre.SRE_Match object; span=(0, 6), match='a1a1a1'>
<_sre.SRE_Match object; span=(0, 0), match=''>
import re
if __name__ == '__main__':
# 1.[] 匹配[]中出現(xiàn)的任意一個(gè)字符撤防。
# 匹配字符串前三位是abc開始虽风,第4位是1或者q
re_str = r'abc[1q].'
print(re.fullmatch(re_str,'abc12'))
print(re.fullmatch(re_str, 'abcq1'))
# 2.[^]匹配不再[]中出現(xiàn)的任意一個(gè)字符
# 匹配一個(gè)字符串,前三位是acc第4位不是123的字符串
# re_str = r'acc[^123]'
re_str = r'acc[^\da]'
print(re.fullmatch(re_str,'accb'))
# [0-9]匹配0-9的任意一個(gè)數(shù)字
# [a-z]匹配小寫字母
# [A-Z]匹配大寫字母
# [a-zA-z]匹配所有字母
# re_str = r'[-a-zA-Z]\w*' 標(biāo)識(shí)符
# 3.*匹配0次或者多次
re_str = r'\d*abc'
print(re.fullmatch(re_str,'abc'))
print(re.fullmatch(re_str,'1abc'))
print(re.fullmatch(re_str,'123abc'))
# 4.+:匹配一次或多次
re_str = r'\d+a*'
#至少一次數(shù)字,+至少0次字母
print(re.fullmatch(re_str,'111aa'))
print(re.fullmatch(re_str,'22aa'))
# 5.?:匹配0次或者1次
re_str = r'[a-z]?123'
print(re.fullmatch(re_str,'123'))
print(re.fullmatch(re_str,'s123'))
# re_str =r'[1-9]\d*'
# re_str =r'\+?[1-9]\d*'
# re_str =r'[+]?[1-9]\d*'
# 6.{N} 匹配N次
# re_str =r'\d{5}abc'
print(re.fullmatch(re_str,'12345abc'))
# 7.{M,}至少匹配M次 >=M次
re_str = r'\d{3,}\w*'
print(re.fullmatch(re_str,'123abc'))
print(re.fullmatch(re_str, '1223abcd'))
# 8.{M,N}匹配次數(shù) M<=次數(shù)<=N
re_str =r'\d{8,16}'
print(re.fullmatch(re_str,'12345678'))
re_str = r'[\da-zA-z]{8,16}'
# 9.| 分支
# 匹配三個(gè)數(shù)字或者三個(gè)小寫字母
re_str = r'\d{3}|[a-z]{3}'
print(re.fullmatch(re_str,'123'))
# 10.()匹配的時(shí)候是分組,讓括號(hào)中的正則條件變成一個(gè)整體
# 匹配一個(gè)字符串辜膝,a1整體重復(fù)3次
re_str = r'(a1){3}'
print(re.fullmatch(re_str,'a1a1a1'))
#=====================================
#11.*无牵?重復(fù)1次或多次,盡可能少的重復(fù)
re_str = r'a*?'
print(re.match(re_str,'aaaaa'))
#12.??重復(fù)0次或者1次厂抖,盡可能少的重復(fù)
re_str = r'b??'
#13.{M,N}? 重復(fù)M-N范圍茎毁,0次或1次,盡可能少的重復(fù)
#14.{N,}?重復(fù)至少N次忱辅,盡可能少的重復(fù)
<_sre.SRE_Match object; span=(0, 5), match='abc12'>
<_sre.SRE_Match object; span=(0, 5), match='abcq1'>
<_sre.SRE_Match object; span=(0, 4), match='accb'>
<_sre.SRE_Match object; span=(0, 3), match='abc'>
<_sre.SRE_Match object; span=(0, 4), match='1abc'>
<_sre.SRE_Match object; span=(0, 6), match='123abc'>
<_sre.SRE_Match object; span=(0, 5), match='111aa'>
<_sre.SRE_Match object; span=(0, 4), match='22aa'>
<_sre.SRE_Match object; span=(0, 3), match='123'>
<_sre.SRE_Match object; span=(0, 4), match='s123'>
None
<_sre.SRE_Match object; span=(0, 6), match='123abc'>
<_sre.SRE_Match object; span=(0, 8), match='1223abcd'>
<_sre.SRE_Match object; span=(0, 8), match='12345678'>
<_sre.SRE_Match object; span=(0, 3), match='123'>
<_sre.SRE_Match object; span=(0, 6), match='a1a1a1'>
<_sre.SRE_Match object; span=(0, 0), match=''>
import re
if __name__ == '__main__':
re_srt = r'\d+\.\d+'
print(re.fullmatch(re_srt,'123.68'))
# \加數(shù)字:匹配前面第N個(gè)組中匹配到的內(nèi)容
re_srt = r'([1-9][a-z]{2})\1'
print(re.fullmatch(re_srt,'1acac'))
re_srt = r'[1-9]\d{4,11}'
re_srt = r'\w{6,20}'
re_srt =r'((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))'
print(re.fullmatch(re_srt,'192.168.1.1'))
re_str = r'((25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)'
print(re.fullmatch(re_str, '0.168.234.255'))
re_srt = r'((\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])'
print(re.fullmatch(re_str, '192.168.1.1'))
<_sre.SRE_Match object; span=(0, 11), match='192.168.1.1'>
<_sre.SRE_Match object; span=(0, 13), match='0.168.234.255'>
<_sre.SRE_Match object; span=(0, 11), match='192.168.1.1'>
python對(duì)正則表達(dá)式的支持
# 1.compile(正則字符串):將正則表達(dá)式字符串轉(zhuǎn)換為正則表達(dá)式對(duì)象
# 轉(zhuǎn)換為正則表達(dá)式對(duì)象后七蜘,可以通過對(duì)象調(diào)用相關(guān)方法
re_obct = re.compile(r'\w{6,12}')
print(re_obct.fullmatch('asd_daw'))
<_sre.SRE_Match object; span=(0, 7), match='asd_daw'>
# 2.匹配相關(guān)的方法
# fullmatch(正則表達(dá)式,字符串)
# 完全匹配墙懂,從字符串開頭匹配到結(jié)束橡卤,返回一個(gè)匹配對(duì)象
# 匹配失敗返回None
match = re.fullmatch(r'\w{3}','a_a')
print(match)
# a.獲取匹配結(jié)果
print(match.group())
# b.獲取匹配到的范圍
print(match.span())
# c.獲取匹配的開始下標(biāo)與結(jié)束下標(biāo)
print(match.start(),match.end())
# d.獲取被匹配的字符串(元字符串)
print(match.string)
# 判斷一個(gè)字符串是否是某種字符
<_sre.SRE_Match object; span=(0, 3), match='a_a'>
a_a
(0, 3)
0 3
a_a
# 3.match(正則表達(dá)式,字符串)不完全匹配损搬,從字符串開頭開始匹配碧库,匹配到正則表達(dá)式對(duì)應(yīng)的范圍為止
# 類似于判斷是否以正則表達(dá)式開頭
match = re.match(r'\w{3}','abc**')
print(match)
# 判斷一個(gè)字符串是否以某種字符串開頭
<_sre.SRE_Match object; span=(0, 3), match='abc'>
[Finished in 0.3s]
# 4.search(正則表達(dá)式,字符串)在指定的字符串中
# 查找以正則表達(dá)式描述的字符串巧勤,如果有多個(gè)只返回第一個(gè),沒有返回None
print(re.search(r'\d{2,}[a-z]','a23na123n--123b'))
search = re.search(r'\d{2,}[a-z]','a23na123n--123b')
print(search)
<_sre.SRE_Match object; span=(0, 3), match='abc'>
<_sre.SRE_Match object; span=(1, 4), match='23n'>
# 5.re.findall(正則表達(dá)式谈为,字符串)去獲取指定字符串中滿足正則條件的所有的子串
# 如果有多個(gè)返回一個(gè)子串列表,沒有返回空列表[]
print(re.findall(r'\d{2,}[a-z]','--12a*ad(123aa*'))
print(re.findall(r'[a-zA-z](\d)', '--a12a*ad923aa*'))
#在通過正則表達(dá)式獲取子串的時(shí)候踢关,可以通過在正則表達(dá)式中添加括號(hào)伞鲫,
#來約束()中的內(nèi)容,只獲取括號(hào)中的內(nèi)容签舞,匹配的時(shí)候還是按正則表達(dá)式查找
#字符串提取
['12a', '123a']
['1', '9']
# 6.re.finditer(正則表達(dá)式秕脓,字符串)
# 返回的是一個(gè)迭代器,迭代器的內(nèi)容是匹配對(duì)象
# 表達(dá)式中()捕獲無效
result = re.finditer(r'\d{2,}[a-z]','--12a*ad(123qq*')
for x in result:
print(x)
<_sre.SRE_Match object; span=(2, 5), match='12a'>
<_sre.SRE_Match object; span=(9, 13), match='123q'>
[Finished in 0.2s]
# 7.re.split正則表達(dá)式儒搭,字符串)
#按正則表達(dá)式匹配到的字符串進(jìn)行切割,返回值是列表吠架,列表元素就是切割后、
# 被分段的字符串
print(re.split(r'\d*','sa1ada12dad123ds1234d3(&'))
['sa', 'ada', 'dad', 'ds', 'd', '(&']
# 8.re.sub(正則表達(dá)式,替換字符串,原字符串)
#在原字符串中查找符合正則的子串搂鲫,替換成新的字符串
print(re.sub(r'a|b|c|d','*','happy birstay today hava fun'))
h*ppy *irst*y to**y h*v* fun
[Finished in 0.2s]