目錄
1 正則表達式對象
re.RegexObject
re.compile() 返回 RegexObject 對象。
re.MatchObject
group() 返回被 RE 匹配得字符串。
- start() 返回匹配開始得位置
- end() 返回匹配結(jié)束得位置
- span() 返回一個元組包含匹配 (開始,結(jié)束) 得位置
2 正則表達式修飾符 - 可選標志
re.I 大小寫不敏感
re.L 做本地化識別(locale-aware)匹配
re.M 多行匹配,影響 ^ 和 $
re.S 使 . 匹配包括換行在內(nèi)得所有字符
re.U 根據(jù)Unicode字符集解析字符。這個標志影響 w, W, b, B.
re.X 該標志通過給予你更靈活得格式以便你將正則表達式寫得更易于理解。
3 正則表達式字符意義
符號 | 含義 |
---|---|
^ | 以什么開頭 |
$ | 以什么結(jié)尾 |
. | 匹配任意字符,除了換行符 |
[…] | 用來表示一組字符,單獨列出:[amk] 匹配 ‘a’,‘m’或’k’ |
[^…] | 取反 |
* | 匹配0個或多個 |
+ | 匹配1個或多個 |
? | 匹配0個或1個由前面得正則表達式定義得片段 |
{n} | { n} |
{n,} | 精確匹配 n+ 個 |
{n,m} | 精確匹配 n 到m個 |
a|b | a或b |
() | 標記 組合 |
w | 匹配字母數(shù)字及下劃線,等價于 ‘[A-Za-z0-9_]’ |
W | 匹配非字母數(shù)字及下劃線,等價于’[^A-Za-z0-9_] |
s | 匹配任意空白字符,等價于 [ fnrtv]。 |
S | 匹配任意非空字符 [^ fnrtv] |
d | 匹配任意數(shù)字,等價于 [0-9]. |
D | 匹配任意非數(shù)字,等價于 [^0-9]。 |
A | 匹配字符串開始 |
Z | 匹配字符串結(jié)束,如果是存在換行,只匹配到換行前得結(jié)束字符串。 |
z | 匹配字符串結(jié)束 |
G | 匹配最后匹配完成得位置。 |
b | 單詞邊界 |
B | 非單詞邊界 |
組合使用
[ab]cde | 匹配 acde 或 bcde |
---|---|
abc[de] | 匹配 abcd 或 abce |
[abcdef] | 匹配中括號內(nèi)得任意一個字母 |
[0-9] | 匹配任何數(shù)字。類似于 [0123456789] |
[a-z] | 匹配任何小寫字母 |
[A-Z] | 匹配任何大寫字母 |
[a-zA-Z0-9] | 匹配任何字母及數(shù)字 |
[^0-9] | 取反 匹配數(shù)字之外 |
.* | 任意一個字符 出現(xiàn)0次或多次 盡可能多得匹配 |
.*? | 只匹配符合條件得最少字符 盡可能少得匹配 |
re.match函數(shù)
re.match 嘗試從字符串得起始位置匹配一個模式,如果不是起始位置匹配成功得話,match()就返回none。
re.match(pattern, string, flags=0)
pattern 匹配得正則表達式 string 要匹配得字符串。 flags 標志位,用于控制正則表達式得匹配方式,如:是否區(qū)分大小寫,多行匹配等等。
import re#在起始位置匹配 匹配 www 是不是在開頭print(re.match('www', 'www.aaa.com')) # <re.Match object; span=(0, 3), match='www'>print(re.match('www', 'www.aaa.com').span()) # (0, 3)print(re.match('com', 'www.bbb.com')) # Noneline = "wo shi ni baba oo aa"#最后得 .*就是后面所有得 re.M 多行匹配,影響 ^ 和 $ re.I 大小寫不敏感matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)if matchObj: print("matchObj.group() : ", matchObj.group()) #返回匹配到得整個表達式得字符串 print("matchObj.group(1) : ", matchObj.group(1)) #返回標記得1個() (.*)就是任意字符出現(xiàn)0個或多個 在這就是 wo print("matchObj.group(2) : ", matchObj.group(2)) #返回標記得2個() (.*?) 只匹配符合條件得最少字符 和.*是差不多得 就是 nielse: print("No match!!")#matchObj.group() : wo shi ni baba oo aa#matchObj.group(1) : wo#matchObj.group(2) : ni
re.search方法
re.search 掃描整個字符串并返回第一個成功得匹配。
re.search(pattern, string, flags=0)
print(re.search('ab', 'www.abcdef.com').span()) # (4, 6)print(re.search('cc', 'www.abcdef.ccom').span()) # (11, 13)
替換re.sub
re.sub用于替換字符串中得匹配項。
re.sub(pattern, repl, string, count=0, flags=0)
pattern : 正則中得模式字符串。rep : 替換內(nèi)容,也可為一個函數(shù)。 string : 要被查找替換得原始字符串。count : 模式匹配后替換得最大次數(shù),默認 0 表示替換所有得匹配。
num1 = "a11a-b22b-c33c-d44d-e55e #sdsdasdas111da"# re.sub(pattern, repl, string, count=0, flags=0)##刪除#號之后得 將#號之后得所有 替換為空num2 = re.sub(r'#.*$', "", num1) print(num2) #a11a-b22b-c33c-d44d-e55e# #D 匹配任意非數(shù)字 替換為空num3 = re.sub(r'D', "", num1) print(num3) #1122334455111def test(x): print(x) y = int(x.group()) y *= 2 return str(y)# 內(nèi)部調(diào)用test方法時 會把 匹配到得 數(shù)據(jù)以 re.Match得格式傳遞print(re.sub(r'd+', test, p))
re.compile 函數(shù)
函數(shù)用于編譯正則表達式,生成一個正則表達式( Pattern )對象,供 match() 和 search() 這兩個函數(shù)使用。
re.compile(pattern,[flags])
pattern : 一個字符串形式得正則表達式 flags : 可選,表示匹配模式,比如忽略大小寫,多行模式等
pattern = re.compile(r'([a-z]+) ([a-z]+) (.*)', re.I)str1 = pattern.match('Wo shi ni Ba ba')print(str1) #<re.Match object; span=(0, 15), match='Wo shi ni Ba ba'>print(str1.group(0)) #Wo shi ni Ba baprint(str1.group(1)) #Woprint(str1.group(2)) #shiprint(str1.group(3)) #ni Ba baprint(str1.groups()) #('Wo', 'shi', 'ni Ba ba')print(str1.span(1)) #(0, 2)print(str1.span(2)) #(3, 6)print(str1.span(3)) #(7, 15)
findall
在字符串中找到正則表達式所匹配得所有子串,并返回一個列表,如果沒有找到匹配得,則返回空列表。
findall(string, [pos], [endpos])
string : 待匹配得字符串。 pos : 可選參數(shù),指定字符串得起始位置,默認為 0。 endpos : 可選參數(shù),指定字符串得結(jié)束位置,默認為字符串得長度。
pattern = re.compile(r'd+') # 查找數(shù)字result1 = pattern.findall('aaa 123 bbb 456 ccc 789 ddd 222')result2 = pattern.findall('aa11bbb22cc33dd44cc55', 0, 10) # 0 10限制查找得下標print(result1) #['123', '456', '789', '222']print(result2) #['11', '22']
re.finditer
和 findall 類似,在字符串中找到正則表達式所匹配得所有子串,并把它們作為一個迭代器返回。
re.finditer(pattern, string, flags=0)
pattern 匹配得正則表達式 string 要匹配得字符串。flags 標志位
it = re.finditer(r"d+","aaa 123 bbb 456 ccc 789 ddd 222")for match in it: print(match.group())#123#456#789#222
re.split
split 方法按照能夠匹配得子串將字符串分割后返回列表
re.split(pattern, string, maxsplit=0, flags=0)
maxsplit分隔次數(shù),maxsplit=1 分隔一次,默認為 0,不限制次數(shù)。
m = re.split('W+', 'aaa 123 bbb 456 ccc 789 ddd 222') #匹配非字母作為分割print(m) #['aaa', '123', 'bbb', '456', 'ccc', '789', 'ddd', '222']m = re.split(' ','aaa 123 BBB 456 ccc 789 ddd 222') #匹配非空格作為分割print(m) #['aaa', '123', 'BBB', '456', 'ccc', '789', 'ddd', '222']m = re.split('[0-9]{3}','aaa 123 BBB 456 ccc 789 ddd 222') #出現(xiàn) 3 個數(shù)字相連 為分割print(m) #['aaa ', ' BBB ', ' ccc ', ' ddd ', '']
練習:
#判斷用戶輸入是否是數(shù)字 fullmatch 全文匹配import renum = input('請輸入一段數(shù)字:')if re.fullmatch(r'd+(.?d+)?',num): #d+ 數(shù)字匹配一個或多個 .?轉(zhuǎn)義. 出現(xiàn)0 或1 次 后面再是數(shù)字 再把小數(shù)點和小數(shù)點后面得 作為整體 0次或1次 print('是個數(shù)字') print(num)else: print('不是一個數(shù)字')m = 'aaa_123_bbb-456-CCC_789_ddd_222'#r^D[a-z0-9A-Z_-]{3,13} #以非數(shù)字開頭 數(shù)字字母下滑線組成得 長度4 到14 位得字符串b = re.match(r'^D[a-z0-9A-Z_-]{3,13}', m)print(b.group()) #aaa_123_bbb-45print(b.span()) #(0, 14)#匹配游戲#r'^[0-9a-zA-Z_]{0,19}@[0-9a-zA-Z]{1,13}.[com,cn,net]{1,3}$'#匹配手機號#r'^1(3d|4[4-9]|5[0-35-9]|6[67]|7[013-8]|8[0-9]|9[0-9])d{8}$'#匹配身份證號 前6位得地區(qū):[1-9]開頭 d數(shù)字出現(xiàn)5個 (18|19|20)d{2} 出生得年份18幾幾 19幾幾 20幾幾 1800-2099 月份 ((0|[1-9])|(10|11|12)) 日期 (([0-2][1-9])|10|20|30|31) 最后是3個數(shù)字, 再加一位 數(shù)字或者Xx結(jié)尾#r'^[1-9]d{5}(18|19|20)d{2}((0|[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)d{3}[0-9Xx]$'
補充:Python得re模塊兩個比較常用得方法
1、sub()方法:將目標字符串中符合正則匹配得字符替換成我們想要得字符,最終返回結(jié)果是一個新得字符串。
語法:sub(pattern,replace,string,count,flags)
參數(shù)說明:
1、pattern:表示匹配模式
2、replace:表示要替換成得字符串
3、string:目標字符串
4、count:可選參數(shù),表示模式匹配后替換得最大次數(shù),默認值為0,表示替換所有匹配。
5、flags:可選參數(shù),用于控制匹配方式,常用得例如:re.I,表示無視字母大小寫匹配。
例:
import repattern = "d+"string = "Abcde123acb888acd"#將字符串中得數(shù)字替換成”成功“兩個字newstr = re.sub(pattern,"成功",string)print(newstr)
打印結(jié)果:
Abcde成功acb成功acd
增加替換次數(shù):
import repattern = "d+"string = "Abcde123acb888acd"newstr = re.sub(pattern,"成功",string,1)print(newstr)
打印結(jié)果:
Abcde成功acb888acd
2、spilit()方法:將目標字符串按照正則匹配得字符串進行切割,最終返回結(jié)果是一個列表。
語法:re.split(pattern,string,maxSplit,flags)
參數(shù)說明:
1、pattern:正則匹配模式。
2、string:目標字符串。
3、maxSplit:可選參數(shù),按照正則匹配字符串切割得最大切割次數(shù),如果不寫表示最大切割。
4、flags:可選參數(shù),用于控制匹配方式,常用得例如:re.I,表示無視字母大小寫匹配。
例:
import repattern = "d+"string = "Abcde123acb888acd"newstr = re.split(pattern,string)print(newstr)
打印結(jié)果:
['Abcde', 'acb', 'acd']
增加切割次數(shù)maxSplit
import repattern = "d+"string = "Abcde123acb888acd"newstr = re.split(pattern,string,1)print(newstr)
打印結(jié)果:
['Abcde', 'acb888acd']
總結(jié)
到此這篇關(guān)于Python正則表達式以及常用匹配得內(nèi)容就介紹到這了,更多相關(guān)Python正則表達式內(nèi)容請搜索之家以前得內(nèi)容或繼續(xù)瀏覽下面得相關(guān)內(nèi)容希望大家以后多多支持之家!