主要提供正則相關(guān)的方法
import re
1.什么是正則
'''
正則是字符串匹配的一種工具,擁有自己的語法。語法中主要包含各種符號的使用
'''
2.正則的語法
'''
re.fullmatch(正則表達(dá)式,字符串) - 檢查字符串是否完全符合正則表達(dá)式的規(guī)則(完全匹配)
匹配成功返回匹配對象,匹配失敗返回N
正則表達(dá)式 - Python中的正則表達(dá)式是寫在引號中(單雙引號),但是一般情況下會引號前加r
r'正則表達(dá)式'
'''
print('===========匹配符號==========')
1)普通字符 - 除了正則中有特殊功能或特殊意義以外的其他的所有字符
普通字符在正則中表示字符本身
表示一個字符串有三個字符,每個字符分別是abc
re_str = r'ac'
result = re.fullmatch(re_str, 'ac')
print(result)
2) . - 匹配任意字符
'''
正則中出現(xiàn) . 的位置可以品牌任意字符
一個 . 只能匹配一個任意字符
'''
re_str = r'a..c'
result = re.fullmatch(re_str, 'a3-c')
print(result)
3)\w - 匹配字母、數(shù)字或者下劃線
'''
一個\w只能匹配一個字符(只針對ascii碼有效)
'''
re_str = r'a\w.c'
result = re.fullmatch(re_str, 'af3c')
4)\s - 匹配一個空白字符
'''
空白:空格、回車/換行、制表符
'''
result = re.fullmatch(r'aaa\sf2', 'aaa\nf2')
print(result)
5)\d - 匹配一個數(shù)字字符
6)\大寫字母 - 匹配非\小寫字母匹配的內(nèi)容
'''
\W - 匹配非數(shù)字、字母或者下劃線
\S - 匹配非空白字符
\D - 匹配非數(shù)字字符
'''
7)[] - 匹配字符集
'''
a.普通用法
[字符集] - 匹配字符集中的任意一個字符
[ad] - 匹配一個字符是a或者d
[\davc] - 匹配一個字符是數(shù)字或者a或者v或者c
b.表示范圍的字符集: [字符1-字符2] - 從字符1到字符2中的任意一個字符,注意字符2的編碼值必須是大于等于字符
[5-9]
[a-z]
[a-zA-Z] - 匹配任意一個字母
[a-zA-Z\d] - 匹配字母數(shù)字
c.反向選中:[^字符集] - 選中字符集中以外的其他的任意的一個字符
'''
result = re.fullmatch(r'[^abc]', '.')
print(result)
print('==========檢測符號==========')
一個匹配符號必須對應(yīng)一個具體的字符;檢測符號只是對符號所在的位置進(jìn)行檢查,不會影響字符串長度
1)\b - 檢測是否是單詞邊界
'''
單詞邊界:一切可以將兩個單詞區(qū)分開的符號都是單詞邊界,單詞開頭,單詞結(jié)尾,空白,標(biāo)點(diǎn)符號
'''
匹配一個字符串是'howare',然后檢測w的后面是否是單詞邊界
print(re.fullmatch(r'how\b are', 'how are'))
2) ^ - 檢測 ^ 所在的位置是否是字符串開頭
3)
所在的位置是否是字符串結(jié)尾
貪婪和非貪婪
'''
,+,?,{}對應(yīng)匹配次數(shù)是貪婪;在匹配次數(shù)不確定的時候才有貪婪與非貪婪的區(qū)分
在匹配次數(shù)不確定的符號后面加?,就會變成非貪婪:?,+?,??,{M,N}?,
貪婪:在匹配成功的前提下盡可能多的匹配
非貪婪:在匹配成功的前提下盡可能少的匹配
'''
result = re.search(r'.+b', '1312abe121ab==')
print(result)
result = re.search(r'.+?b', '1312abe121ab')
print(result)
| 分支
'''
正則表達(dá)式1|正則表達(dá)式2
'''
() - 分組
'''
1)分組 - 將正則的中的一部分看成一個整體進(jìn)行操作
2)重復(fù) - 添加分組后可以在分組的后面通過\M來重復(fù)前面第M個分組匹配到的結(jié)果
'''
print(re.fullmatch(r'(\d+)aad\1', '223aad223'))
轉(zhuǎn)義符號 - 在正則符號前加\讓符號的功能消失
'''
正則中的轉(zhuǎn)義符號和字符串的轉(zhuǎn)義字符是兩回事
獨(dú)立的特殊符號放在[]中特殊意義會自動消失,但是' - ',' [] '
'''
print(re.fullmatch(r'\.ad', '.ad'))
import re
print('=============匹配次數(shù)=============')
1.匹配次數(shù)
1) * - 匹配0次或多次
"""
字符* - *前的字符出現(xiàn)0次或者多次
r'a' - '','a','aa', 'aaa', 'aaaa',...
r'\d' - '', '1', '34', '11892'
r'[abc]*' - '', 'a', 'ab', 'abbc', 'aaccbbb'
"""
print(re.fullmatch(r'a\d*b', 'a9888723b'))
print(re.fullmatch(r'a\d*b', 'ab'))
2) + - 匹配1次或多次
print(re.fullmatch(r'a\d+b', 'ab')) # None
print(re.fullmatch(r'a\d+b', 'a8232323b'))
3) ? - 匹配0次或1次
print(re.fullmatch(r'[+-]?\d+', '-293'))
4) {}
"""
{N} - 匹配N次
{M,N} - 匹配M到N次
{M,} - 匹配至少M(fèi)次
{,N} - 最大匹配N次
"""
print(re.fullmatch(r'a{3}123', 'aaa123'))
print(re.fullmatch(r'a{2,5}123', 'aaa123'))
print(re.fullmatch(r'\d{3,}', '2238902324'))
print(re.fullmatch(r'\d{,3}', '219'))
練習(xí): 驗(yàn)證輸入用戶名和QQ號是否有效并給出對應(yīng)的提示信息
要求:
用戶名必須由字母、數(shù)字或下劃線構(gòu)成且長度在6~20個字符之間
QQ號是5~12的數(shù)字且首位不能為0
result = re.fullmatch(r'[\da-zA-Z_]{6,20}', 'huashd920')
if result:
print('用戶名合法')
else:
print('用戶名不合法')
result = re.fullmatch(r'[1-9]\d{4,11}', '43232333')
if result:
print('QQ合法')
else:
print('QQ不合法')
2.貪婪和非貪婪
"""
*,+,?,{}對應(yīng)匹配次數(shù)是貪婪; 在匹配次數(shù)不確定的時候才有貪婪和非貪婪的區(qū)分
在匹配次數(shù)不確定的符號后面加?,就會變成非貪婪: *?, +?, ??, {M,N}?, {M,}?, {,N}?
貪婪:在匹配成功的前提下,盡可能多的匹配
非貪婪: 在匹配成功的前提下,盡可能少的匹配
"""
result = re.search(r'.+b', '123aabcccaabdddb====')
print(result) # 123aabcccaabdddb
result = re.search(r'.+?b', '123aabcccaabdddb====')
print(result) # 123aab
result = re.search(r'a+?b', 'aab===')
print(result)
# 練習(xí): 獲取所有name對應(yīng)的值
with open('files/data', encoding='utf-8') as f:
content = f.readline()
names = re.findall(r'"name":"(.+?)"', content)
print(len(names), names)
3. | - 分之
"""
正則表達(dá)式1|正則表達(dá)式2
"""
print(re.fullmatch(r'\d{3}|[a-zA-Z]{3}', 'asd'))
4. () - 分組
"""
- 分組 - 將正則中的一部分看成一個整體進(jìn)行操作
- 重復(fù) - 添加分組后,可以分組的后面通過\M來重復(fù)前面第M個分組匹配到的結(jié)果
"""
需求: 一個字符串最開頭是三個數(shù)字或者三個小寫字母,后面全是大寫字母
# 233KKSSK, abcJKJKJSKJDKJFKD
print(re.fullmatch(r'(\d{3}|[a-z]{3})[A-Z]+', 'ahsKLSA'))
# 23:45:67:78:67:89
print(re.fullmatch(r'(\d\d:)+\d\d', '34:54:34:67:90:12'))
# 23abc23, 100abc100, 39abc39 -> 匹配成功
# 23abc12 -> 匹配失敗
print(re.fullmatch(r'(\d+)abc\1', '100abc100'))
print(re.fullmatch(r'(\d+)([a-z]+)=\2([abc]{3})=\1{2}', '23ac=acaaa=2323'))
5. 轉(zhuǎn)義符號 - 在正則符號前加,讓符號的功能消失
"""
正則中的轉(zhuǎn)義符號和字符串的轉(zhuǎn)義字符是兩回事兒
獨(dú)立的特殊符號放在[]中特殊意義會自動消失, 但是-,[]...
"""
re_str = r'\.abc'
print(re.fullmatch(re_str, '=abc'))
# 1+3
re_str = r'\d\+\d\\w'
print(re.fullmatch(re_str, '2+3\w'))
re_str = r'[.+*]abc[?]' # .、+、*、?表示本身
print(re.fullmatch(re_str, '+abc?'))
# re_str = r'[a\-z]abc'
re_str = r'[az-]abc'
print(re.fullmatch(re_str, '-abc'))
re_str = r'[a\]^]abc'
print(re.fullmatch(re_str, ']abc'))
1.創(chuàng)建正則對象(了解)
"""
compile(正則表達(dá)式) - 根據(jù)正則表達(dá)式創(chuàng)建正則對象
"""
re_obj = compile(r'\d{3}')
print(fullmatch(r'\d{3}', '823'))
print(re_obj.fullmatch('234'))
2. 匹配
"""
fullmatch(正則表達(dá)式, 字符串) - 讓整個字符串和正則表達(dá)式進(jìn)行匹配
match(正則表達(dá)式, 字符串) - 匹配字符串開頭
返回值: 匹配成功是匹配結(jié)果對象,匹配失敗是None
"""
result = fullmatch(r'\d{3}[a-z]{4}', '234jkka')
print(result)
result = match(r'(\d{3})([a-z]{4})', '789hsjd三家分晉看jshjdh')
print(result)
匹配結(jié)果
1)匹配結(jié)果對應(yīng)的字符串
"""
匹配對象.group() - 獲取整個正則匹配到的結(jié)果
匹配對象.group(N) - 獲取第N個分組匹配到的結(jié)果
"""
print(result.group())
print(result.group(1)) # 取第一個分組的結(jié)果
print(result.group(2)) # 取第二個分組的結(jié)果
2)獲取匹配位置
"""
匹配對象.span(group=0)
匹配對象.start(group=0)
匹配對象.end(group=0)
"""
print(result.span(1)) # 取第一個分組匹配到的位置
print(result.start(1))
print(result.end(2))
3)獲取原字符串
print(result.string)
3.查找
"""
search(正則表達(dá)式,字符串) - 匹配出字符串中第一個滿足正則表達(dá)式的子串,結(jié)果是匹配對象
findall(正則表達(dá)式,字符串) - 獲取字符串中滿足正則表達(dá)式的所有的子串;結(jié)果是列表,列表中元素是字符串
finditer(正則表達(dá)式,字符串) - 獲取字符串中滿足正則表達(dá)式的所有的子串; 結(jié)果是迭代器,迭代器的元素是匹配對象
"""
result = search(r'\d{3}', 'how34,jks789lsoos009,.sdf9822')
print(result)
result = findall(r'\d{3}', 'how34,jks789lsoos009,.sdf9822')
print(result) # ['789', '009', '982']
result = findall(r'(\d{3})', 'how34d,jks789asoos009,.sdf9822a==sd')
print(result) # ['789', '822']
result = findall(r'(\d{3})([a-z]{2,})', 'how342ddfb,jks789aasoos009,.sdf9822ad==sd')
print(result) # [('342', 'ddfb'), ('789', 'aasoos'), ('822', 'ad')]
result = finditer(r'(\d{3})([a-z]{2,})', 'how342ddfb,jks789aasoos009,.sdf9822ad==sd')
print(result)
print(next(result))
4.切割
"""
split(正則表達(dá)式, 字符串) - 按照滿足正則表達(dá)式的子串對字符串進(jìn)行切割。返回列表
"""
str1 = 'aaa9bbb0ccc90ddd87eee123fff'
# print(str1.split('9'))
print(split(r'\d+', str1))
5.替換
"""
sub(正則表達(dá)式, 字符串1, 字符串2, 替換次數(shù)=0) - 將字符串2中滿足正則表達(dá)式的子串替換成字符串1
替換次數(shù)是0的時候全部替換
"""
str1 = 'aaa9bbb0ccc90ddd87eee123fff'
new_str = sub(r'\d+', '+', str1)
print(new_str) # aaa+bbb+ccc+ddd+eee+fff
new_str = sub(r'\d+', '+', str1, 2)
print(new_str) # aaa+bbb+ccc90ddd87eee123fff
result = search(r'abc', 'hAbCjsfabckjks', flags=IGNORECASE)
print(result)