Python正則表達式以及常用匹配實例

目錄

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|ba或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)容希望大家以后多多支持之家!

聲明:所有內(nèi)容來自互聯(lián)網(wǎng)搜索結(jié)果,不保證100%準確性,僅供參考。如若本站內(nèi)容侵犯了原著者的合法權(quán)益,可聯(lián)系我們進行處理。
發(fā)表評論
更多 網(wǎng)友評論1 條評論)
暫無評論

返回頂部

主站蜘蛛池模板: 国产精品美女久久久久AV福利| 日本免费观看网站| 国产乱子伦露脸在线| 一个人看的www免费高清 | 亚洲AV色香蕉一区二区三区蜜桃 | 久久国产精品免费观看| 精品久久久久久亚洲中文字幕| 国产精品视频永久免费播放| 久久久受www免费人成| 男人和女人在床做黄的网站| 国产极品视觉盛宴| 一本大道香焦在线视频| 欧美乱大交xxxxx| 四虎亚洲国产成人久久精品| 91久久香蕉国产线看| 日本三级免费看| 亚洲激情小视频| 色一情一乱一伦一视频免费看| 影音先锋成人资源| 日本人与黑人videos系列| 波多野结衣上班| 美国十次精彩在线视频| 麻豆aⅴ精品无码一区二区| 99久久免费观看| 中国极品美軳免费观看| 亚洲av中文无码乱人伦在线视色 | 精品无码国产一区二区三区51安| 老司机67194精品线观看| 五月天久久婷婷| 丝袜情趣在线资源二区| 亚洲午夜成人片| 免费又黄又爽的视频| 午夜福利一区二区三区在线观看| 国产一区二区三区樱花动漫| 国产一区二区女内射| 国产一区二区三区不卡在线观看| 国产亚洲精品精品国产亚洲综合| 国产乱人伦av在线a| 啦啦啦最新在线观看免费高清视频| 四影虎库1515mc海外| 午夜理论影院第九电影院|