正則表達式:用來做字符串查找,匹配,切割的一種工具
- python對正則表達式的支持:提供了re模塊(python內置模塊),包含了字符串匹配、查找、切割等相關方法
- fullmatch(正則表達式,字符串):用正則表達式來和字符串進行匹配,看是否能夠匹配成功
- 正則表達式:是一個符合正則規范的字符串
import re # 引入re模塊
注意:正則表達式的字符串前要加'r',來阻止轉義.
因為正則表達式有帶''的符號,具有特殊意義
1. '.'匹配一個任意字符
reStr = r'..' # 匹配兩個任意字符的字符串
# reStr = 'ab' # 只能匹配字符串'ab'
print(re.fullmatch(reStr, 'ab'))
2. \w:匹配一個字符是字母、數字、或下劃線
reStr = r'\w'
print(re.fullmatch(reStr, 'a'))
3. \s:匹配一個空白字符(空格、換行、制表符)
reStr = r'a\sb'
print(re.fullmatch(reStr, 'a\nb'))
4. \d:匹配一個數字字符
reStr = r'00\d' # 匹配一個00后一個是數字的字符串
print(re.fullmatch(reStr, '009'))
5. \b:檢測單詞邊界(字符串結束或者開頭,一般字符或者換行,空白都可以作為單詞邊界)
print(re.match(r'...\b', '666?5')) # 匹配三個連續任意字符(兩邊是邊界)
6. ^:匹配字符串開始(^th→匹配以th開頭得字符串)
print(re.findall(r'^th', 'thaaaaa ththbbb'))
7. $:匹配字符串結束
print(re.findall(r'\.(com)$', "aaa.com"))
8. \W:匹配非字母、數字、下劃線
print(re.fullmatch(r'\W\w', '+6'))
9. \S:匹配非空白字符
print(re.fullmatch(r'\S\d', '66'))
10. \D:匹配非數字
print(re.fullmatch(r'\D\w', '_a'))
11. \B:檢測非邊界
print(re.match(r'ab\Bc', 'abc'))
正則表達式符號組合
1. []匹配出現在[]中得任意一個字符
print(re.fullmatch(r'aab[3a,]', 'aab3')) # 匹配一個字符串,前三位是aab,后面一位是3或者a或者,
print(re.fullmatch(r'[\d_]abc', '5abc')) # 第一位是數字或者下劃線,后面是abc
2. [^]:匹配不在[]中出現的字符
print(re.fullmatch(r'abc[^\dabc]', 'abcd')) # 前面是abc第四位不是數字和a/b/c的
'''
[0-9]:匹配0,1,2,3,4,5,6,7,8,9中的任意一個字符
[a-z]:匹配任意一個小寫字母
[A-Z]:匹配任意一個大寫字母
'''
print(re.fullmatch(r'[1-9]', '6'))
print(re.fullmatch(r'[a-zA-Z]', 'B'))
re_str = r'[]'
3. * :匹配0次或者多次
"""匹配一個字符串,前面是0個或者多個數字字符,然后是abc"""
re_str = r'\d*abc'
print(re.fullmatch(re_str, '123abc'))
print(re.fullmatch(r'\d\d*', '654654'))
print(re.fullmatch(r'[0-9][0-9]*', '654654'))
# 檢測字符串是否是合格的標識符
print(re.fullmatch('[a-zA-Z_]\w*', 'a_23w'))
4. 匹配一次或者多次
# 匹配一個字符串開頭出現一次或者多個數字字符,然后再有0次或者多次數字、字符、下劃線
print(re.fullmatch(r'\d+\d*', '123aaadwwdasadwa'))
5. 匹配0次或1次
print(re.fullmatch(r'[a-z]?123', '123'))
判斷一個字符串是否是正整數
print('=============================================================')
print(re.fullmatch(r'\+?[^0]\d*', '+0123')) # re.fullmatch(r'[+]?[^0]\d*', '+0123')
print('=============================================================')
6. {N}:匹配N次
print(re.fullmatch(r'[a-z]{3}123', 'asd123')) # 字符串前三個是小寫字母,后面是123
7. {N,}匹配大于等于N次
# 至少前三位是數字
print(re.fullmatch(r'[0-9]{3,}abc', '12333abc'))
8. {M,N}匹配M到N次
print(re.fullmatch(r'[0-9]{3,5}abc', '123333abc'))
9. | 分支
print(re.fullmatch(r'\d{3}|[a-z]{3}', 'zzz')) # 匹配3個數字或3個小寫字母
10. ():匹配的時候對應分組,讓括號中的正則條件變成一個分組
print(re.fullmatch(r'(\d{3})|([a-z]{3})', 'zzz')) # 匹配3個數字或3個小寫字母
11. *?:重復任意次,盡可能少的重復
print(re.match(r'a*?', 'aabaa'))
12. +?:重復一次或多次,盡可能少
13. ??:重復0次或1次,盡可能少
14. {N}:重復至少N次,盡可能少
15. {M,N}:重復M到N次盡可能少
正則表達式
- 正則中:.[]{}()*+?^$|有特殊意義,所以在正則表達式中,如果想要單純的表達這些字符,需要在前面加''
注意: '-'在[]中可能是特殊的符號
.{}()+?$|在[]中不用加\來表示字符*
import re
# 1.\N → 匹配前面第N個組中匹配到的內容
reStr = r'([0-9][a-z]{2})6\1'
print(re.fullmatch(reStr, '8hh68hh'))
# Case:用戶名和QQ
reUserName = r'\w{6,20}'
QQ = r'[1-9]\d{4,11}'
print(re.fullmatch(reUserName, 'ads466ds4'))
print(re.fullmatch(QQ, '321321'))
# Case:正則表達式判斷字符串是不是0-255
ip = 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])'
# ip = reStr + r'\.' + reStr + r'\.' + reStr + r'\.' + reStr
print(re.fullmatch(ip, '12.34.7.34'))
re模塊方法
1.compile(正則字符串)將正則表達式字符串轉換成正則表達式對象
# 轉換成正則表達式對象之后,可以通過對象調用方法
re_obct = re.compile(r'\w{6,12}')
print(re_obct.fullmatch('6666666'))
2.fullmatch(正則表達式, 字符串) 完全匹配,從字符串開頭匹配到結尾
# 返回值是匹配對象,匹配失敗返回None
match = re.fullmatch(r'\w{3}', 'sss')
print(match)
# a.獲取匹配結果
print(match.group())
# b.獲取匹配到的范圍
print(match.span())
# c.獲取匹配到的開始下表和結束下標
print(match.start(), match.end())
# d.獲取被匹配的源字符串
print(match.string)
3.match(正則表達式,字符串) 不完全匹配,從字符串開頭開始匹配,匹配到正則表達式對應的范圍為止
# 返回值是匹配對象,匹配失敗返回None
match = re.match(r'\w{3}', 'asdas135sss')
print(match)
print(match.group())
print(match.string)
# 應用:判斷一個字符串是否以某種字符開頭
4.search(正則表達式,字符串) 在指定的字符串中查找某種字符串(以正則表達式來描述),如果有多個滿足條件,只返回第一個
# 返回值是匹配對象,匹配失敗返回None
print(re.search(r'\d{2,}[a-z]', 'sh23n--877m0899'))
# 應用: 判斷一個字符串是否包含某種字符
5.findall(正則表達式,字符串)獲取指定字符串中滿足條件的所有子串
# 返回值,列表中是符合要求的字符串.沒有滿足要求的字串就返回[]
result = re.findall(r'\d+', 'a132d123g15gg5fe')
print(result)
# 注意:在通過正則表達式獲取子串的時候,可以通過在正則表達式中添加括號,來約束獲取的內容(只捕獲括號中的內容)匹配的時候還是按照正則的原則去查找
# 應用:提取字符串
6.finditer(正則表達式,字符串)用法同findall,只是返回類型不同
# 返回一個迭代器,迭代器中內容是匹配對象
# 注意:()捕獲部分無效
result = re.finditer(r'[a-zA-Z](\d+)', '13asd13sad5aw=f1f65ds')
for match in result:
print(match)
7.split(正則表達式,字符串)按正則表達式匹配到的字符串進行切割
# 返回值是列標,列表元素就是被切割后被分段的字符串
result = re.split(r'[\[\]*\-]', 'a[asd2]gk6*egafko;e-agf468-ad*ads')
print(result)
8.sub(正則表達式, 新字符串, 源字符串)在源字符串中查找符合正則的字串,替換成新的字符串
str1 = 'agljhjlnksgdkgakbjhgadbs阿凡達,美國婢女力和蘇聯坦克h'
result = re.sub(r'a', '*', str1)
print(str1, '\n'+result)