01-正則表達(dá)式的符號
正則表達(dá)式:用來做字符串查找、匹配、切割用的一種工具
python對正則表達(dá)式的支持:提供了re模塊(python內(nèi)置模塊),包含字符串匹配、查找、切割等相關(guān)的方法
fullmatch(正則表達(dá)式,字符串):用正則表達(dá)式來和字符串進(jìn)行匹配,看是否能夠匹配成功
正則表達(dá)式:是一個符合正則規(guī)范的字符串
import re
- 注意:正則表達(dá)式的字符串,前面一般要加r來阻止轉(zhuǎn)義。因為正則表達(dá)式的符號中有很多帶''的符號,其功能不是轉(zhuǎn)義,而是表示特殊的意義
- . :匹配一個任意的字符
"""匹配兩個任意字符的字符串"""
re_str =r'..'
"""匹配第一個字符是a第二個字符是b的字符串"""
re_str = r'ab'
"""匹配第一個字符是a,第二個字符是任意字符的字符串"""
- . :匹配一個任意的字符
re_str = r'a.' print(re.fullmatch(re_str,'ab')) - 2 \w :匹配一個字符是字母、數(shù)字或者下劃線
"""匹配第一個字符是字母、數(shù)字或者下劃線,第二個字符是字母、數(shù)字或者下劃線的字符串"""re_str = r'\w\w' print(re.fullmatch(re_str,'45')) - 3 \s :匹配一個空白字符(空格、回車、換行、制表符)
"""匹配第一個字符是a,第二個字符是空白,最后一個字符是b的字符串"""
re_str = 'a\sb'
print(re.fullmatch(re_str,'a\nb'))
- 4 \d :匹配一個數(shù)字字符
re_str = '\d\d\d'
print(re.fullmatch(re_str,'123'))
- 5 \b :檢測邊界(單詞邊界---一般的符號都可以作為單詞邊界)
"""匹配三個任意字符的前面和后面都是單詞邊界的字符串"""
re_str = r'\b...\b'
print(re.match(re_str,'asa'))
- 6.^ :檢測字符串開始(^the -- 匹配以The開頭的字符串)
re_str = r'^The'
print(re.fullmatch(re_str,'The'))
print(re.findall(r'The','dsdsf dhsThe'))
- 7.$ : 檢測字符串結(jié)束
re_str = r'abc$'
print(re.findall(re_str,'dsadafaf abc'))
- \W :匹配非字母、數(shù)字、下劃線
re_str = r'\W\w'
print(re.fullmatch(re_str,'@d'))
- 9.\S:匹配非空白字符
re_str = r'\S\d'
print(re.fullmatch(re_str,'p8'))
10.\D:匹配非數(shù)字字符
"""匹配第一個字符是非數(shù)字字符,第二個字符是字母、數(shù)字、下劃線"""
re_str = r'\D\w'11.\B: 檢測非邊界
"""匹配前面兩個字符是ab,第三個字符是c,并且b后面是一個非邊界"""
re_str = 'ab\Bc'
print(re.fullmatch(re_str,'abc'))
02-正則表達(dá)式符號組合
import re
if __name__ == '__main__':
- 1.[] :匹配[]中出現(xiàn)的任意一個字符
"""匹配一個字符串,前三位是abc,第四位是字符1或字符a"""
re_str = r'abc[1a]'
print(re.fullmatch(re_str,'abc1'))
"""第一位是數(shù)字或者下劃線,后面是abc"""
re_str = r'[\d_]abc'
print(re.fullmatch(re_str,'9abc'))
- 2.[^]:匹配不在[]中出現(xiàn)的任意一個字符
"""匹配一個字符串,前三位是abc,第四位不是數(shù)字字符也不是字符a"""
re_str = r'abc[^\da]'
print(re.fullmatch(re_str,'abcu'))
- *:匹配0次或者多次
"""匹配一個字符串,前面是0個或者多個數(shù)字字符,然后是abc"""
- *:匹配0次或者多次
re_str = r'\d*abc'
print(re.fullmatch(re_str,'123abc'))
```
[0-9]:匹配0,1,2,3,4,5,6,7,8,9中的任意一個字符
[a-z]:匹配任意一個小寫字母
[A-Z]:匹配任意一個大寫字母
[a-zA-Z]:匹配所有的字母
```
print(re.fullmatch(r'[1-9]','7'))
- 寫一個正則表達(dá)式,判斷一個字符串是數(shù)字字符串(不能是空串)
re_str = r'\d\d*' #或者re_str = r'[0-9][0-9]*'
print(re.fullmatch(re_str,'1212'))
- 寫一個正則表達(dá)式,檢測一個字符串是否是合格的標(biāo)識符(字母數(shù)字下劃線注冊,數(shù)字不能開頭)
re_str = r'[a-zA-Z_]\w*'
print(re.fullmatch(re_str,'&s3as645_'))
- 4.+ :匹配一次或者多次
"""匹配一個字符串開頭出現(xiàn)一次或者多次數(shù)字字符,然后再有0次或者多次數(shù)字、字母、下劃線"""
re_str = r'\d+\w*'
print(re.fullmatch(re_str,'1abc'))
- 5.?: 匹配0次或者一次
re_str = r'[a-z]?123'
print(re.fullmatch(re_str,'123'))
- 判斷一個字符串是否是正整數(shù)字符串'123' or '+123' ->成功 '0123'->None
re_str = r'[+]?[1-9]\d*'
print(re.fullmatch(re_str,'+123'))
- 6.{N}匹配N次
"""前面5個數(shù)字,然后是abc"""
re_str = r'\d{5}abc'
print(re.fullmatch(re_str,'12123abc'))
- 7.{N,}: 匹配大于等于N次
"""字符串前面至少三位數(shù)字"""
re_str = r'\d{3,}.*'
print(re.fullmatch(re_str,'4546ds'))
- 8.{M,N}匹配至少M次,最多N次
"""密碼要求:數(shù)字、字母組成,并且8-16位"""
re_str = r'[\da-zA-Z]{8,16}'
print(re.fullmatch(re_str,'46565sas'))
- | 分支
"""匹配一個字符串,是三個數(shù)字字符或者是三個小寫字符"""
- | 分支
re_str = r'\d{3}|[a-z]{3}'
print(re.fullmatch(re_str,'wba'))
- 10.()匹配的時候是分組,讓括號中的正則條件變成一個整體
"""匹配一個字符串,abc整體重復(fù)三次"""
re_str = r'(abc){3}'
print(re.fullmatch(re_str,'abcabcabc'))
re_str = r'(\d\w[0-3]){2}'
print(re.fullmatch(re_str,'3o37h1'))
"""==========以下了解============"""
# 盡可能少:在能夠匹配到的前提下盡可能的少
# 11.*?重復(fù)任意次,盡可能的少重復(fù)
re_str = r'a*?'
print(re.match(re_str,'aaaa'))
# 12.+?重復(fù)一次或多次,盡可能少的重復(fù)
re_str = r'ba+?'
print(re.match(re_str,'baaaaa'))
# 13.?? 重復(fù)0次或者1次,盡可能少的重復(fù)
re_str = r'b??'
03-正則表達(dá)式
正則中:.\ [] {}() * + ? ^ $ |, 這些字符有特殊意義,所以在正則表達(dá)式中如果想要單純的表達(dá)這些字符,需要在前面加''
注意:1.- 在中括號中可能是特殊的符號
2..{} () * + ? $ | 在中括號中可以不用加\,來表示字符
import re
if __name__ == '__main__':
re_str = r'\d+\.\d+'
print(re.fullmatch(re_str,'12.56'))
re_str = r'[\^]'#匹配 字符 ^
re_str = r'[\\]'#匹配 字符 \
re_str = r'\$'
print(re.fullmatch(re_str,'\\'))
- 1.\N - -> 匹配前面第N個組中匹配到的內(nèi)容
re_str = r'([1-9][a-z]{2})\1'
print(re.fullmatch(re_str,'8hh8hh'))
- 用戶名必須由字母、數(shù)字或下劃線構(gòu)成且長度在6-20個字符之間
QQ號是5-12位的數(shù)字且首位不能為0
re_str = r'\w{6,20}'
print(re.fullmatch(re_str,'dsdsdsde'))
re_str = r'[1-9]\d{4,11}'
print(re.fullmatch(re_str,'939138680'))
- IP地址是否合法
"""
x.x.x.x
寫一個正則表達(dá)式判斷一個字符串是否是:1-255
"""
re_str = r'((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[1-9])\.){3}((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[1-9]))'
04-re模塊方法
import re
if __name__ == '__main__':
- 1.compile(正則字符串) 將正則表達(dá)式字符串轉(zhuǎn)換成正則表達(dá)式對象
# 轉(zhuǎn)換成正則表達(dá)式對象后,可以通過對象調(diào)用相關(guān)的方法
re_object = re.compile(r'\w{6,12}')
print(re_object.fullmatch('ahsjjs'))
- 2.fullmatch(正則表達(dá)式,字符串)完全匹配,從字符串開頭匹配到結(jié)尾
# 返回值是匹配對象,如果匹配失敗,返回None
match = re.fullmatch('\w{3}','h3s')
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)
# 應(yīng)用:判斷一個字符串是否是某種字符串(判斷賬號、密碼是否符合要求等)
- 3.match(正則表達(dá)式,字符串) 不完全匹配,從字符串開頭開始匹配,匹配到正則表達(dá)式對應(yīng)的范圍為止
# 返回值是匹配對象,如果匹配失敗,返回None
match = re.match('\w{3}','h3shhh')
print(match)
print(match.group())
print(match.string)
# 應(yīng)用:判斷一個字符串是否以某種字符串開頭
- 4.re.search(正則表達(dá)式,字符串),在指定的字符串中查找某種字符串(以正則表達(dá)式來描述)
# 如果有多個滿足條件的,只匹配到第一個
# 返回值是匹配對象,如果找不到符合要求的返回None
print(re.search(r'\d{2,}[a-z]','sha23n--870899'))
# 應(yīng)用:判斷一個字符串是否包含某種字符串
- 5.findall(正則表達(dá)式,字符串)去獲取指定字符串中滿足正則條件的所有的子串
# 返回值是列表,列表中是符合要求的字符串,沒有滿足要求的子串就返回[]
result = re.findall(r'\D\d+\D','a123buye236oks')
print(result)
注意:在通過正則表達(dá)式獲取子串的時候,可以通過在正則表達(dá)式中添加括號,來約束獲取的內(nèi)容,只獲取括號中匹配到的內(nèi)容匹配的時候還是按原正則表達(dá)式去查找
應(yīng)用:字符串提取6.finditer(正則表達(dá)式,字符串)用法和findall一樣,只是返回值的類型不一樣
返回一個迭代器,迭代器中的內(nèi)容是匹配對象
注意:()捕獲部分無效
result = re.finditer(r'\D\d+\D', 'a123buye236oks')
for match in result:
print(match)
- 7.split(正則表達(dá)式,字符串) 按正則表達(dá)式匹配到的字符串進(jìn)行切割
# 返回值是列表,列表元素就是切割后被分段的字符串
result = re.split(r'\d+','dsfdw12e7rvx8qdw')
print(result)
- 8.sub(正則表達(dá)式,替換字符串,原字符串) 在原字符串中查找符合正則的子串,替換成新的字符串
返回值是替換后的字符串
"""將指定字符串中所有的‘sb’替換成 * """
str1 = '你好sb,你全家都是sb'
result = re.sub(r'sb','*',str1)
print(result)