一、正則表達式1
from re import fullmatch, search, findall
0.fullmatch
fullmatch(正則表達式, 字符串) - 查看字符串和正則表達式是否匹配,如果不匹配結(jié)果就是None
正則表達式:r'正則語法'
1.什么是正則表達式
正則表達式是處理字符串的工具负甸,通過撥不通的正則符號來描述字符串的規(guī)則
2.正則符號(正則表達式的語法)
1)普通字符 - 除了在正則中有特殊功能和特殊意義的符號以外的字符都算普通字符
普通字符代表字符本身
匹配一個字符串有三個字符,分別是'a', 'b', 'c'
re_str = r'abc'
result = fullmatch(re_str, 'abc')
print(result)
2). - 匹配任意一個字符
一個.只能匹配一個字符
匹配一個字符串長度是8,前三個字符時abc弧轧,后三個字符時123礁遣,中間是兩個任意字符
re_str = r'abc..123'
result = fullmatch(re_str, 'abcwl123')
print(result)
3)\w - 匹配一個數(shù)字斑芜、字母或者_(在ASCII碼表中)
一個\w只能匹配一個字符
匹配一個長度是4的字符串,第一個字符時數(shù)字祟霍、字母杏头、或_,后面是哪個字符是'abc'
re_str = r'\wabc'
result = fullmatch(re_str, '_abc')
print(result)
4)\d - 匹配任意一個數(shù)字字符
匹配一個長度是5 的字符串沸呐,前兩個字符是任意數(shù)字醇王,后面三個是任意字符
re_str = r'\d\d...'
result = fullmatch(re_str, '98lol')
print(result)
5)\s - 匹配任意一個空白字符
空白字符包括:空格、換行崭添、制表符...
result = fullmatch(r'how\sare!', 'how are!')
print(result)
6)\大寫字母
\D - 匹配除了數(shù)字字符以外的任意字符(匹配一個非數(shù)字字符)
\S - 匹配一個非空白字符
re_str = r'\Dabc\S'
result = fullmatch(re_str, 'aabc5')
print(result)
7)[字符集] - 匹配字符集中出現(xiàn)的任意一個字符
注意:一個[]只能匹配一個字符
a.
[abc] - 匹配abc中任意一個字符
[趙錢孫李] - 匹配趙錢孫李中的任意一個字符
匹配一個長度是4的字符串寓娩,第一個字符是1或者3或者3,后面是abc
re_str = r'[137]abc'
print(fullmatch(re_str, '1abc'))
b.
[1-9] - 匹配1到9中的任意一個字符(字符編碼值遞增)
[a-z] - 匹配任意一個小寫字母
[A-Z] - 匹配任意一個大寫字母
[a-zA-Z] - 匹配任意一個字母
[a-zA-Z0-9_] / [A-Za-z0-9_] - 匹配任意一個字母呼渣、數(shù)字或_
[ \t\n] - 匹配任意一個空白字符
[\u4e00-\u9fa5] - 匹配任意一個中文字符
re_str = r'[!-&]abc'
print(fullmatch(re_str, '!abc'))
8)[^字符集] - 匹配不在字符集中的任意一個字符
[^abc] - 匹配任意一個不是a棘伴、b、c的字符
檢測符號
所有的檢測符號都不會影響字符串的長度
1)\b - 檢查是否是單詞邊界
單詞邊界 - 能夠?qū)蓚€單詞隔開并且不會產(chǎn)生歧義的任意符號:空白字符屁置、標(biāo)點符號焊夸、字符串開頭字符串結(jié)尾
how are、how缰犁,are淳地、how-are
匹配規(guī)則:先去掉\b對字符串進行匹配,如果匹配成功再檢查\b所在的位置是否是單詞邊界
2)^ - 檢查^所在位置是否是字符串開頭
注意:這兒的^是在[]外
3)所在的位子是否是字符串結(jié)尾
二帅容、正則表達式2
from re import *
控制次數(shù)的符號:字符符號
1.* - 匹配0次或多次
123a* - 123后面a出現(xiàn)0次貨多次
123\d* - 123后面出現(xiàn)0個或者多個任意數(shù)字字符
123[mnxy9]* - 123
re_str = r'abc0*123'
print(fullmatch(re_str, 'abc123'))
2.+ - 匹配1次或多次
re_str = r'123[abc]+'
print(fullmatch(re_str, '123abcaaaa'))
3.? - 匹配0次或1次
-?123 - 123/-123
re_str = r'_?abc'
print(fullmatch(re_str, '_abc'))
4.{}
1){N} - 匹配N次
a{3} - 匹配三個a, aaa
\d{3} - 匹配三個任意數(shù)字
匹配電話號碼
re_str = r'1[3-9]\d{9}'
2){M,N} - 匹配M到N次(至少M次颇象,最多N次)
匹配密碼:要求是6-12位的字母
re_str = r'[a-zA-Z]{6,12}'
3){M,} - 匹配至少M次
4){,N} - 匹配最多N次
5.貪婪和非貪婪
在匹配次數(shù)不確定的時候,會出現(xiàn)貪婪和非貪婪兩種情況:默認(rèn)情況都是貪婪的并徘。
什么是貪婪:在能夠匹配成功的前提下遣钳,匹配次數(shù)盡可能多
re_str = r'a.+'
print(search(re_str, 'sda====fsjuhfisf54df54d'))
print(search(r'a\d{3,8}', 'dahhfdbja12315456413215'))
什么是非貪婪:在能夠匹配成功的前提下,匹配次數(shù)盡可能少;(在匹配次數(shù)后加?)
*?
+?
??
{M,N}?
{M,}?
{,N}?
print(search(r'a\d{3,8}?', 'dahhfdbja12315456413215'))
分之
- |
正則1|正則2 - 先讓正則1區(qū)匹配麦乞,如果匹配成功就成功蕴茴;匹配失敗再讓正則2去匹配
(正則1和正則2中只要有一個能夠匹配成功就行)
練習(xí)1:寫一個正則表達式,匹配一個字符串:abc的前面是兩個數(shù)字或者兩個大寫字母
23abc姐直,WLabc
方法一:
re_str = r'\d{2}abc|[A-Z]{2}abc'
方法二:
分組
1.() - 將括號里面的內(nèi)容作為一個整體
1)整體操作
r'(\d\d|[A-Z]{2})abc'
2)a8d5d6f8
r'([a-z]\d){4}'
3)分組
a.方便后面分段或者分情況取不同的匹配結(jié)果
b.分組重復(fù):在正則中用\X來重復(fù)前面第X個分組匹配到的內(nèi)容
注意:\X的前面必須有這個分組
re_str = r'abc|123'
print(fullmatch(re_str, 'abc'))
print(fullmatch(re_str, '123'))
轉(zhuǎn)義
1.加
在正則中有特殊功能和特殊意義的符號前加\倦淀,讓這個符號的特殊功能和意義消失
2.加[]
在[]中有特殊意義的符號有兩個:a.^放在開頭 b.-放在兩個字符之間
其他符號包括:.+ ? * $,這些單獨的符號在[]中都表示符號本身
三声畏、re模塊
from re import *
re模塊是python提供的撞叽,專門針對正則表達式應(yīng)用相關(guān)函數(shù)
1.compile(正則表達式) ->將正則表達式轉(zhuǎn)換成正則對象
compile()
2.字符串匹配
fullmatch(正則表達式, 字符串) - 讓正則表達式和字符串完全匹配
match(正則表達式, 字符串) - 匹配字符串開頭
以上兩個方法的結(jié)果:匹配失敗結(jié)果是None姻成,匹配成功返回匹配對象
re_str = r'\d{3}'
print(fullmatch(re_str, '789'))
print(match(re_str, '123dasuidhdihif==='))
1)匹配對象
result = fullmatch(r'(\d{3})=([a-z]{2})', '234=am')
print(result)
a.獲取匹配到的字符串
匹配對象.group() - 獲取整個正則表達式匹配到的字符串,結(jié)果是字符串
匹配對象.group(N) - 獲取整個正則表達式中地N個分組匹配到的字符串
print(result.group())
print(result.group())
print(result.group(1))
print(result.group(2))
b.獲取匹配到的字符串在原字符串中的位置信息
匹配對象.span() ->返回匹配結(jié)果在原字符串中的下標(biāo)范圍:[開始下標(biāo)愿棋,結(jié)束下標(biāo))
匹配對象.span(N) ->返回地N個分組匹配到的結(jié)果在原字符串中的范圍
print(result.span())
print(result.span(2))
start, end = result.span(1)
print(start, end)
c.獲取原字符串
匹配對象.string
print(result.string)
3.查找
1)search(正則表達式, 字符串) - 在字符串中查找第一個滿足正則表達式的子串科展,如果找到了結(jié)果是匹配對象,找不到就是None
result = search(r'\d{3}', '是否234ash==347jsdf')
print(result)
2)findall(正則表達式, 字符串) - 獲取字符串中所有滿足正則表達式的子串糠雨;返回值是一個列表
注意:如果正則表達式中有分組才睹,列表中的匹配結(jié)果只會去分組匹配到的內(nèi)容
result = findall(r'\d{3}[a-z]{2}', '是234hu士大夫345mmks89h-=數(shù)348kl幾十塊的')
print(result)
result = findall(r'(\d{3})([a-z]{2})', '是234hu士大夫345mmks89h-=數(shù)348kl幾十塊的')
print(result)
3)finditer(正則表達式, 字符串) - 獲取字符串中所有滿足正則表達式的子串;返回值是一個迭代器
result = finditer(r'(\d{3})([a-z]{2})', '是234hu士大夫345mmks89h-=數(shù)348kl幾十塊的')
group = []
group1 = []
group2 = []
for i in result:
group.append(i.group())
group1.append(i.group(1))
group2.append(i.group(2))
print(group,group1,group2)
4.切割
split(正則表達式, 字符串) ->將字符串中滿足正則表達式的子串作為切割點隊長字符進行切割甘邀,返回值是一個字符串列表
result = split(r'\d+', '愛好3ja89是電話費889將括號看0===三等獎9數(shù)據(jù)98=的')
print(result)
5.替換
sub(正則表達式, 字符串1 , 字符串2) - 將字符串2中所有滿足正則表達式的子串都替換成字符串1琅攘,返回一個字符串
message = input('評論:') # 你媽逼,fuck you 鹃答,F(xiàn)UCK!
new_massage = sub(r'媽|fuck|逼', '*', message, flags=IGNORECASE)
print(new_massage)