1.什么是正則表達式
正則表達式是字符串匹配工具,是為了在某些需求下可以更方便、更快捷的處理字符串
2.怎么使用正則處理字符串
python通過提供re模塊來支持正則表達式
re.fullmatch(正則表達式,字符串) - 讓正則表達式和字符串進行完全匹配,返回匹配結(jié)果,如果匹配不成功返回None
3.怎么寫正規(guī)表達式
python中正則表達式是放在字符串中,并且這個字符串一般會在最前面加r/R。
r'正則'
4.正則語法
普通字符 - 代表字符本身
re_str = r'a'
result = re.fullmatch(re_str,'a')
print(result)
. - 匹配任意一個字符
一個 . 代表一個字符,匹配是任意字符
re_str = r'.abc'
result = re.fullmatch(re_str,'1abc')
print(result)
\w - 匹配一個ASCII表中的字母,數(shù)字,下劃線。還可以匹配非ASCII碼表字符
re_str = r'.\w'
result = re.fullmatch(re_str,'s_')
print(result)
\s - 匹配一個空白字符
空白字符包括:空格,回車,制表符
re_str = r'\s\sa'
result = re.fullmatch(re_str,'\n\ta')
print(result)
\d - 匹配一個數(shù)字字符
re_str = r'年齡:\d\d'
result = re.fullmatch(re_str,'年齡:12')
print(result)
\b - 檢測單詞邊界(檢測\b所在的位置是否是單詞邊界)
單詞邊界:所有能夠標(biāo)志一個單詞開始或者結(jié)束的符號。
^ - 檢測是否是字符串開頭
result = re.fullmatch(r'^\d\d','23')
print(result)
$ - 檢測是否是字符串結(jié)尾
result = re.fullmatch(r'\d\d$','89金額:23,100 年齡:81')
print(result)
\大寫字母 - 對‘\小寫字母’的否定
\W - 匹配非數(shù)字、字母、下劃線
\S - 匹配非空白字符
\D - 匹配非數(shù)字字符
\B - 檢測是否是非單詞邊界
[字符集] - 匹配 [] 中任意一個字符
a.
[普通字符集] - 匹配 [] 中任意一個字符
b.用 - 表示范圍
[字符1-字符2] - 匹配編碼值在字符1編碼到字符2編碼之間的任意一個字符 (ord(字符1) < ord(字符 2))
[0-9] - 所有數(shù)字字符中的一個
[2-9] - 所有'2'-'9'數(shù)字字符中的一個
[一-龥] - 所有中文字符中的一個
c.[]內(nèi)容中的最前面加^,表示否定 (只有放在[]里的最前面才有意義)
[^abc] - 表示 除了'a''b''c'的任意一個字符
[^a-z] - 表示 除了小寫字母的任意一個字符
# 匹配一個字符串長度為 4 ,后3位是‘123’,第一位是 ‘a(chǎn)’‘b’‘c’中任意一個
re_str = r'[abc]123'
result = re.fullmatch(re_str,'a123')
print(result)
轉(zhuǎn)義符號 - 將正則中有特殊意義或者特殊功能的符號 變成普通符號
a.在中括號外
在特殊符號前加'\'讓其特殊意義消失
b.在中括號內(nèi)
單獨的有特殊意義的符號,除了'^'在最前面,'-'在兩個字符之間,其他的都不需要轉(zhuǎn)義,特殊意義自動消失
================匹配次數(shù)==============
- 匹配 0 次 或者 多次
r'a*bc' - 匹配一次字符串,'bc'前有0個或者多個a
r'\d*' - 匹配一個字符串由 0 個或者多個任意數(shù)字字符組成
"""
re_str = r'a\d*b'
result = re.fullmatch(re_str,'a12b')
print(result)
# 練習(xí),寫一個正則表達式能夠匹配所有的小數(shù)
re_str = r'\d\d*\.\d\d*'
result = re.fullmatch(re_str,'5144.1233')
print(result
- 匹配至少一次
re_str = r'\d+\.\d+'
result = re.fullmatch(re_str,'5144.1233')
print(result)
{}
"""
{N} - 匹配N次
{M,N} - 匹配 M 到 N 次
{M,} - 匹配至少M次
{,N} - 匹配最多N次
"""
re_str = r'\d{4}'
result = re.fullmatch(re_str,'2134')
print(result)
re_str = r'\d{2,5}'
result = re.fullmatch(re_str,'12')
print(result)
re_str = r'\d{4,}'
result = re.fullmatch(re_str,'2134')
print(result)
re_str = r'\d{,4}'
result = re.fullmatch(re_str,'')
print(result)
? - 匹配 0 次或 1 次
==============貪婪和非貪婪==============
匹配次數(shù)不明確時,盡可能多的匹配 為 貪婪匹配
非貪婪匹配 是在 次數(shù)不明確的符號后面加 ?
*?
+?
{M,N}?
{M,}?
{,N}?
===================分支/選擇=============
正則1 | 正則2 - 先用正則1去匹配,如果匹配成功就成功,匹配不成功再使用正則2去匹配
要求用戶名全部都是數(shù)字或者字母,長度是6-12
re_str = r'\d{6,12}|[a-zA-Z]{6,12}'
result = re.fullmatch(re_str,'caqwqdqqfq')
print(result)
=================分組()==================
"""
a.將小括號中的內(nèi)容當(dāng)做一個整體來操作
b. \數(shù)字 - 重復(fù)第幾個分組匹配結(jié)果
"""
re_str = r'[a-zA-Z\d](a|b|c)'
result = re.fullmatch(re_str,'2c')
print(result)
re_str = r'(a|b|c)(a|b|c)\2(a|b|c)'
result = re.fullmatch(re_str,'abbb')
print(result)
完全匹配 - 讓字符串長度,字符的值和正則表達式完全匹配
"""
re.fullmatch(正則表達式,字符串) - 匹配成功返回匹配對象,匹配失敗返回None
當(dāng)需要對整個字符串進行條件判斷的時候使用:
"""
result = re.fullmatch(r'(\d{3})=([a-z]{3})','234=haj')
print(result) #<_sre.SRE_Match object; span=(0, 7), match='234=haj'>
span 匹配到的內(nèi)容在源字符串中的位置
print(result.span()) # (0, 7)
print(result.span(1)) # (0, 3) 正則表達式中第一個分組匹配結(jié)果的范圍
print(result.span(2)) # (4, 7) 正則表達式中第二個分組匹配結(jié)果的范圍
print(result.start(2),result.end(2)) # 4 7
獲取匹配到的值
print(result.group()) # 整個正則表達式的匹配結(jié)果
print(result.group(1)) # 第一個分組的匹配結(jié)果
print(result.group(2)) # 第二個分組的匹配結(jié)果
獲取原字符串`
print(result.string)
匹配字符串開頭
"""
re.match(正則表達式,字符串) - 判斷字符串的開頭是否和正則表達式相匹配,匹配成功返回匹配對象,失敗返回None
只檢測字符串開頭是否滿足要求
"""
result = re.match(r'\d{3}','123aaaaa')
print(result)
search
"""
re.search(正則表達式,字符串) - 在字符串中查找是否有和正則表達式匹配的字串,如果沒有返回None
如果有就返回第一個匹配結(jié)果
"""
result = re.search(r'(\d{3})=([a-z]{3})','how 231=aasdd3232=12121===')
print(result,result.span(),result.group())
findall
"""
re.findall(正則表達式,字符串) - 獲取字符串中所有滿足正則表達式的字串,以列表的形式返回
注意: 正則表達式中含有分組,如果只有一個分組,列表元素就是分組匹配到的內(nèi)容
如果有多個分組,列表的元素 就是每個分組匹配的結(jié)果以元祖形式呈現(xiàn)
"""
result = re.findall(r'\d+','au asdai2nbiu23b3ibi 8abaib9')
print(result)
finditer
"""
re.finditer(正則表達式,字符串) - 獲取字符串中所有能夠和正則表達式匹配的子串的匹配結(jié)果。
返回值是一個迭代器,迭代器中的元素是匹配結(jié)果
"""
result = re.finditer(r'abc(\d|[A-Z]{2})','abc2-abcHD===')
print(result)
for item in result:
print(item.group(),item.span())
print(item.group(1))
result = re.findall(r'\d+\.\d+|\d+','are 89he ks90.2 ans78oo1.23h!w9end9009ooo')
print(result) # r'\d+\.?\d*'
sum = 0
for item in result:
sum += float(item)
print(sum)
split
"""
re.split(正則表達式,字符串) - 將字符串按照滿足正則表達式的子串進行切割
"""
result = re.split(r'[=/-]','aaa=ddd-aaw/w22')
print(result)
sub
"""
re.sub(正則表達式,新字符串,字符串,替換次數(shù)) - 將字符串中滿足正則表達式的子串替換成新字符串
替換次數(shù)可以不復(fù)制,表示全部替換
"""
result = re.sub(r'\d','=','aoh2iho23oh441nb23h1h3')
print(result)