"""author = 陳俊龍"""
==============正則表達式符號============
re模塊主要提供正則相關的方法
import re
1.什么是正則
正則是匹配字符串的一直工具常拓,擁有自己的語法赊淑,語法中包含各種符號的使用
2.正則語法
re.fullmatch(正則表達式,字符串) -
檢測字符串是否完全符合正則規(guī)則(完全匹配)
如果匹配成功返回匹配對象舌厨,如果匹配失敗結果返回None
正則表達式 - python中的正則表達式是寫在引號中的內容橄务,可以是單引號罢吃,也可以是雙引號孤荣,但是一般會在引號前加r止后, r'正則表達式'
3.匹配符號
1)普通字符 - 除了正則中有特色功能和特殊意義以外的其他所以字符
例如:a,b,c,123,~,你....
普通字符在正則表達式中就表示字符本身
re_str = r'abc'
res = re.fullmatch(re_str, 'abc')
print(res) # <_sre.SRE_Match object; span=(0, 3), match='abc'>
2).(點) - 匹配任意一個字符
正則中出現(xiàn)點.的位置可以匹配任意字符(一個點匹配一個任意字符)
re_str = r'a..c' # 匹配一個長度是4的字符串,以a開頭葛虐,c結尾胎源,中間任意兩個字符
res = re.fullmatch(re_str, 'a4cc')
print(res) # <_sre.SRE_Match object; span=(0, 4), match='a4cc'>
3)\w - 匹配任意一個字母,數(shù)字屿脐,下劃線(只針對ASCII碼有效)用得較少涕蚤!
re_str = r'a\wc.'
res = re.fullmatch(re_str, 'a_c6')
print(res) # <_sre.SRE_Match object; span=(0, 4), match='a_c6'>
4)\s - 匹配一個空白字符
空白字符:空格,回車/換行的诵,制表符
re_str = r'a\sc.'
res = re.fullmatch(re_str, 'a\nc6')
print(res) # <_sre.SRE_Match object; span=(0, 4), match='a\nc6'>
5) \d - 匹配一個數(shù)字字符
re_str = r'a\dc'
res = re.fullmatch(re_str, 'a6c')
print(res) # <_sre.SRE_Match object; span=(0, 3), match='a6c'>
6) \大寫字母 - 匹配\小寫字母取反的類容
\W - 匹配非數(shù)字万栅,字母下劃線
\S - 匹配非空白字符
\D - 匹配非數(shù)字字符
re_str = r'a\D\S\Wc'
res = re.fullmatch(re_str, 'a#A#c')
print(res) # <_sre.SRE_Match object; span=(0, 5), match='a#A#c'>
7) [ ] - 匹配字符集 注意:一個中括號只匹配一個字符
a.普通用法
[字符集] - 匹配字符集中的任意一個字符
例如:
[az1+] - 表示匹配一個字符是中括號中的任意一個字符
[\dabc] - 表示匹配一個數(shù)字或者a b c 中的一個字符
b.表示范圍的字符集
[字符1-字符2] - 匹配字符1到字符2中的任意一個字符,注意西疤,字符2的編碼值必須大于字符1
例如:
[5-9] - 匹配5到9中的任意一個字符
[a-zA-Z] - 匹配任意一個字母
[a-zA-Z\d_] - 匹配字母烦粒,數(shù)字,下劃線
c.表示反向選中[^字符集] - 表示選中除了字符集中以外的其他任意一個字符
任意字符實例:
re_str = r'[abc\d]bc'
res = re.fullmatch(re_str, 'cbc')
print(res)
范圍實例:
re_str = r'[a-zA-Z\d_]bc'
res = re.fullmatch(re_str, '2bc')
print(res)
反向實例:
re_str = r'[^a-zA-Z\d_]bc'
res = re.fullmatch(re_str, '#bc')
print(res)
4.檢測符號
注意:
一個匹配符號必須對應一個具體字符代赁,而檢測符號只是對符號所在位置進行檢查撒遣,不會影響字符串長度
1)\b - 檢測是否是單詞邊界
單詞邊界:
一切可以將兩個單詞區(qū)分開的符號都是單詞邊界,例如單詞開頭管跺,單詞結尾义黎,空白,標點符號等....
print(re.fullmatch(r'how\b are', 'how are'))
2) ^ - 檢查^所在位置是否是字符串開頭
print(re.fullmatch(r'^how are', 'how are'))
print(re.search(r'^are', 'are234'))
3) $$ - 檢查$所在位置是否是字符串結尾
print(re.search(r'\dare$', '123are234are')) # 如果不加后面$會匹配到3are
==============正則表達式符號2===========
import re
1.匹配次數(shù):
* - 匹配星號*前的字符0次或多次
+ - 匹配加號+前的字符1次或多次
豁跑?- 匹配問號廉涕?前的字符0次或1次
print(re.fullmatch(r'[abc]*', 'aaa'))
print(re.fullmatch(r'[abc]+', 'a'))
print(re.fullmatch(r'[+-]?\d+', '12345'))
{}
{N} - 匹配n次
{M,N} - 匹配m到n次
{M,} - 匹配至少m次
{,N} - 匹配至多N次
print(re.fullmatch(r'a{2}bc', 'aabc'))
print(re.fullmatch(r'a{3,5}bc', 'aaaabc'))
print(re.fullmatch(r'a{3,}bc', 'aaaaaaaaabc'))
print(re.fullmatch(r'a{,5}bc', 'aaaaabc'))
練習:
判斷用戶名和密碼是否合法泻云,用戶名要求必須有數(shù)字字母下劃線,且長度6-20位
print(re.fullmatch(r'[A-Za-z\d_]{6,20}', 'chenjunlong1995'))
print(re.fullmatch(r'[1-9]\d{4,11}', '900000'))
貪婪模式和非貪婪模式:
,+,?,{}對應的匹配次數(shù)都是貪婪的,在匹配次數(shù)不確定的情況下才有貪婪和非貪婪的區(qū)分
在匹配次數(shù)不確定的符號后面加狐蜕?宠纯,就會變成非貪婪:?,+?,??,{m,n}?
貪婪模式:在匹配成功的前提下,盡可能多的進行匹配
非貪婪:在匹配成功的前提下层释,盡可能少的匹配
貪婪模式實例
result = re.search(r'.+b', '123basdb222b')
print(result) # match='123basdb222b'>
非貪婪模式實例
result = re.search(r'.+?b', '123basdb222b')
print(result) # match='123b'
分之
正則表達式1 | 正則表達式2
print(re.fullmatch(r'\d{3}|[a-zA-Z]{3}', 'ZZZ'))
需求:一個字符串最開頭是三個數(shù)字或者三個小寫字母婆瓜,后面大寫字母 分組實例:
print(re.fullmatch(r'(\d{3}|[a-zA-Z]{3})[A-Z]+', 'asdBB'))
4. 分組()
分組() - 將正則中的一部分看成一個整體進行操作
重復 - 添加分組后,可以在分組的后面加上\M來重復前面的第M個分組匹配到的結果
分組實例:
print(re.fullmatch(r'(\d\d:)+\d\d', '19:29:90:88'))
重復實例:
print(re.fullmatch(r'(\d+)abc\1', '12abc12'))
print(re.fullmatch(r'(\d+)([a-z])abc\2', '12aabca'))
print(re.fullmatch(r'(\d+)\1([a-z])abc\2', '1212aabca'))
5.轉義符號 - 在正則符號前加反斜杠\讓符號的功能消失
正則中的轉義符號和字符串的轉義字符串是兩回事
第二種轉義方式:
單獨的特殊符號放在[]中括號中特殊意義也會消失
轉義字符實例:
print(re.fullmatch(r'\.a', '.a'))
print(re.fullmatch(r'\d\+\d', '3+3'))
中括號轉義的實例:
print(re.fullmatch(r'[.]a', '.a'))
print(re.fullmatch(r'\d[+]\d', '3+3'))
print(re.fullmatch(r'[.+*][+]\d', '++3'))
print(re.fullmatch(r'[15-]\d', '-2'))
print(re.fullmatch(r'[a\]]\d', '\6')) # 匹配不了贡羔?廉白??乖寒?猴蹂??楣嘁?磅轻??逐虚?聋溜??叭爱?
=================re模塊==============
import re
1.創(chuàng)建正則對象
compile(正則表達式) - 根據(jù)正則表達式創(chuàng)建正則對象
2.匹配
fullmatch(正則表達式撮躁,字符串) - 讓整個字符串和正則表達式進行匹配(完全匹配)
match(正則表達式,字符串) - 讓正則表達式的開頭和正則表達式進行匹配
返回值:匹配成功是匹配結果對象涤伐,匹配失敗是None
print(re.match(r'[1-9]{3}', '11111111111')) # match='111'>
匹配結果
1)能取到匹配結果對應的字符串
匹配對象.group() - 獲取整個正則匹配到的結果
匹配對象.group(N) - 獲取第n個分組匹配到的結果
獲取匹配結果實例:
result = re.match(r'[1-9]{3}', '11111111111')
print(result.group()) # 111
# 取第二個分組匹配到的結果實例:
result = re.match(r'([1-9])([123])', '12')
print(result.group(2)) # 2
2)獲取匹配位置:
匹配對象.span() - 獲取匹配匹配結果在字符串中的開始和結束下標
匹配對象.span(N)
匹配對象.start()
匹配對象.end()
3).獲取原字符串
匹配對象.string - 獲取原來的字符串
3.查找
search(正則表達式馒胆,字符串) -
匹配出字符串中第一個滿足正則表達式的子串缨称,結果是匹配對象
findall(正則表達式凝果,字符串) -
獲取字符串中所有滿足正則表達式的字串,結果是一個列表睦尽,列表中的元素是字符串
finditer(正則表達式器净,字符串) -
獲取字符串中所有滿足正則表達式的字串,結果是一個迭代器,迭代器的元素是匹配對象
result = re.search(r'\d{3}', '123ashdahdb76438hbbd')
print(result.group()) # 123
result = re.findall(r'\d{3}', '123ashdahdb76438hbbd')
print(result) # ['123', '764']
4.切割
split(正則表達式当凡,字符串) -
按照滿足正則表達式的字串對字符串進行切割山害,返回的是列表
可以使切割更加靈活
str1 = 'aaa0bbb0ccc0ddd'
print(str1.split('0')) # ['aaa', 'bbb', 'ccc', 'ddd']
# 靈活切割實例
str1 = 'aaa01bbb03ccc05ddd'
print(re.split('\d+',str1)) # ['aaa', 'bbb', 'ccc', 'ddd']
5.替換
sub(正則表達式,字符串1沿量,字符串2浪慌,替換次數(shù)=0) -
將字符串2中滿足正則表達式的字串替換成字符串1,替換次數(shù)為0時全部替換
str1 = 'aaa01bbb03ccc05ddd'
print(re.sub('\d+', '+', str1)) # aaa+bbb+ccc+ddd