正則符號(hào)
1.什么是正則
正則是字符串匹配的一種工具因痛,擁有自己的語(yǔ)法蒿柳。語(yǔ)法中主要包含各種符號(hào)的使用
2.正則語(yǔ)法
re.fullmatch(正則表達(dá)式近顷,字符串) - 檢查字符串是否完全符合正則表達(dá)式的規(guī)則(完全匹配)
匹配成功返回匹配對(duì)象泽论,失敗返回None
正則表達(dá)式 - python中正則表達(dá)式是寫在引號(hào)(單引號(hào)或雙引號(hào))中的內(nèi)容步做,
一般會(huì)在引號(hào)的前面加r
r'正則表達(dá)式'
js中的正則:/正則表達(dá)式/
print('==============匹配符號(hào)=================')
# 1)普通字符 - 除了正則中有特殊功能和特殊意義以外的其他所有字符
# 普通字符在正則中表示字符本身
# 例如:a,b,c,1,2,3,~,你,
# 表示一個(gè)字符串有三個(gè)字符,每個(gè)字符分別是a,b,c
re_str = r'abc'
result = re.fullmatch(re_str, 'abc')
print(result)
2) . - 匹配任意字符
正則中出現(xiàn) . 的位置可以匹配任意字符
一個(gè) . 只能匹配任意字符
# 匹配一個(gè)長(zhǎng)度是3的字符串酣胀,字符開(kāi)頭是a刁赦,結(jié)尾是b,中間任意字符
re_str = r'a.b'
result = re.fullmatch(re_str, 'a9b')
print(result)
3)\w - 匹配字符闻镶、數(shù)字或者下劃線(只針對(duì)ascii碼有效)
一個(gè)\w只能匹配一個(gè)字符
注意:Unicode碼中除了ASCII表以外的其他字符都能匹配
result = re.fullmatch(r'a\wb.', 'a_b4')
print(result)
4)\s - 匹配一個(gè)空白字符
空白:空白甚脉、回車/換行、制表符
result = re.fullmatch(r'abc\s123', 'abc\n123')
print(result)
5) \d - 匹配一個(gè)數(shù)字字符
result = re.fullmatch(r'a\d\db', 'a89b')
print(result)
6) \大寫字母 - 匹配非\小寫字母匹配到的內(nèi)容
\W - 匹配非數(shù)字铆农、字母牺氨、下劃線
\S - 匹配非空白字符
\D - 匹配非數(shù)字字符
result = re.fullmatch(r'\D\Dabc\S123', 'qwabc1123')
print(result)
7) [] - 匹配字符集
a.普通用法
[字符集] - 匹配字符集中的任意字符
[az1+] - 匹配一個(gè)字符是a或者z或者1或者+
[\dabc] - 匹配一個(gè)字符是數(shù)字或者a或者b或者c
b.表示范圍的字符集 [字符1-字符2] - 從字符1到字符2中任意一個(gè)字符,字符2的編碼值必須大于字符1
[5-9] - 匹配數(shù)字字符5到9中任意一個(gè)
[a-z] - 匹配小寫字母中的任意一個(gè)
[a-zA-Z] - 匹配任意一個(gè)字母
[a-zA-Z\d_] - 匹配字母數(shù)字下劃線
c.反向選中:[^字符集] - 選中除了字符集中以外的其他的任意一個(gè)字符
[^abc] - 只要不是a或者b或者c都匹配
print(re.fullmatch(r'[az1]abc', '1abc'))
print(re.fullmatch(r'[\daz1]abc', '3abc'))
print(re.fullmatch(r'[a-z]abc', 'vabc'))
print(re.fullmatch(r'[5-8][5-8]', '67'))
print('==============檢測(cè)符號(hào)=================')
# 一個(gè)匹配符號(hào)必須對(duì)應(yīng)一個(gè)具體的字符墩剖;檢測(cè)符號(hào)只是對(duì)符號(hào)所在的位置進(jìn)行檢查猴凹,不會(huì)影響字符串的長(zhǎng)度
# 1)\b - 檢測(cè)是否是單詞邊界
"""
單詞邊界:一切可以將兩個(gè)單詞區(qū)分開(kāi)的符號(hào)都是單詞邊界,例如單詞開(kāi)頭岭皂、單詞結(jié)尾郊霎、空白標(biāo)點(diǎn)符號(hào)等
"""
# 匹配一個(gè)字符串是'howare',然后檢測(cè)w的后面是否是單詞邊界
print(re.fullmatch(r'how\b are', 'how are'))
# 2) ^ - 檢測(cè)^所在的位置是否是字符串開(kāi)頭
print(re.fullmatch(r'^abc', 'abc'))
print(re.search(r'abc', '123abc567'))
# 3) $ - 檢測(cè)$所在的位置是否是字符串結(jié)尾
1.匹配次數(shù)
1)* - 匹配0次或多次
字符 * 前的字符出現(xiàn)0次或者多次
r'a' - '', 'a', 'aa', 'aaa'
print(re.fullmatch(r'a\d*b', 'a3534656b'))
2) + 匹配一次或多次
print(re.fullmatch(r'a\d+b', 'a8823b'))
3)? 匹配0次或一次
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'a{2,}123', 'aa123'))
print(re.fullmatch(r'a{,2}123', 'aa123'))
# qq = input('請(qǐng)輸入球球號(hào)')
# print(re.fullmatch(r'[1-9]\d{4,11}', qq))
# user_name = input('賬號(hào)')
# print(re.fullmatch(r'[\da-zA-Z_]{6,20}', user_name)
2.貪婪和非貪婪
, +, ?, {}對(duì)應(yīng)匹配次數(shù)是貪婪爷绘;在匹配次數(shù)不確定的時(shí)候才有貪婪和非貪婪區(qū)分
在匹配次數(shù)不確定的符號(hào)后面叫书劝?进倍,就會(huì)變成貪婪:?, +?购对,猾昆??骡苞,{M,N}?,{M,}?, {,N}?
貪婪:在匹配成功的前提下盡可能多的匹配
非貪婪:在匹配成功的前提下垂蜗,盡可能少的匹配
result = re.search(r'.+b', '123bcccbdddb====')
print(result)
print(re.search(r'.+?b', '123bcccbdddb===='))
3.分之
正則表達(dá)式1|正則表達(dá)式2
print(re.fullmatch(r'\d{3}|[a-zA-Z]{3}', 'asd'))
4. () - 分組
1.分組 - 將正則中的一部分看成一個(gè)整體進(jìn)行操作
2.重復(fù) - 添加分組后,可以在分組的后面通過(guò)'\M'來(lái)處重復(fù)前面第M個(gè)分組匹配到的結(jié)果
print(re.fullmatch(r'(\d{3}|[a-zA-Z]{3})[A-Z]+', '123WEEWFSD'))
print(re.fullmatch(r'(\d{2}:)+\d\d', '23:43:36:78'))
print(re.fullmatch(r'(\d+)abc\1', '100abc100'))
5.轉(zhuǎn)義符號(hào) - 在正則符號(hào)前加\烙如,讓這個(gè)符號(hào)的功能消失
正則中的轉(zhuǎn)義符號(hào)和字符串的轉(zhuǎn)義字符不一樣
獨(dú)立額特殊符號(hào)放在[]中特殊意義會(huì)自動(dòng)消失么抗,但-,[] ... 除外
re_str = r'\.abc'
print(re.fullmatch(re_str, '.abc'))
print(re.fullmatch(r'\d\+\\d', '2+\d'))
print(re.fullmatch(r'[.+*]abc[?]', '.abc?')) # . * + ?
print(re.fullmatch(r'[a\-z]abc', '-abc'))
print(re.fullmatch(r'[a\]]abc', ']abc'))
1.創(chuàng)建正則對(duì)象
compile(正則表達(dá)式) - 根據(jù)正則表達(dá)式創(chuàng)建正則對(duì)象
re_obj = compile(r'\d{3}')
print(re_obj.fullmatch('234'))
2.匹配
fullmatch(正則表達(dá)式,字符串) - 讓整個(gè)字符串和正則表達(dá)式進(jìn)行匹配
match(正則表達(dá)式, 字符串) - 匹配字符串開(kāi)頭
返回值:匹配成功是匹配結(jié)果對(duì)象亚铁,匹配失敗是None
result = fullmatch(r'\d{3}[a-z]{4}', '123jsdv')
print(result)
result = match(r'(\d{3})[a-z]{4}', '124sdfsaqqw你好')
print(result)
匹配結(jié)果
1)匹配結(jié)果對(duì)應(yīng)的字符串
匹配對(duì)象.group() - 獲取整個(gè)正則匹配到的結(jié)果
匹配對(duì)象.group(N) - 獲取第N個(gè)分組匹配到的結(jié)果
print(result.group())
print(result.group(1))
2)獲取匹配位置
匹配對(duì)象.span(group=0)
匹配對(duì)象.start(group=0)
匹配對(duì)象.end(group=0)
print(result.span(1))
print(result.start())
print(result.end())
3)獲取原字符串
print(result.string)
3.查找
search(正則表達(dá)式, 字符串) - 匹配出字符串中第一個(gè)滿足正則表達(dá)式的字串蝇刀,結(jié)果是匹配對(duì)象
findall(正則表達(dá)式, 字符串) - 獲取字符串中滿足正則表達(dá)式的所有字串;結(jié)果是列表徘溢,列表中是字符串
finditer(正則表達(dá)式, 字符串) - 獲取字符串中滿足正則表達(dá)式的所有的字串吞琐;結(jié)果是迭代器,迭代器的元素是匹配對(duì)象
result = search(r'\d{3}', 'how2144b345in432ln567')
print(result)
result = findall(r'\d{3}', 'how2144b345in432ln567')
print(result)
result = findall(r'(\d{3})a', 'how2144ab345in432aln567')
print(result)
result = finditer(r'(\d{3})a', 'how2144ab345in432aln567')
print(next(result))
print(next(result))
4.切割
split(正則表達(dá)式, 字符串) - 按照滿足正則表達(dá)式的字串對(duì)字符串進(jìn)行切割然爆,返回列表
str1 = 'aaa9bb99ddsf239945529dg14956'
print(str1.split('9'))
print(split(r'\d+', str1))
5.替換
sub(正則表達(dá)式, 字符串1, 字符串2, 替換次數(shù)=0) - 將字符串2中滿足正則表達(dá)式的字串替換成字符串1
替換次數(shù)為0則全部替換
str1 = 'aaa9bb99ddsf239945529dg14956'
new_str = sub(r'\d+', '+', str1, 2)
print(new_str)