您的位置:首頁技術文章
文章詳情頁

Python中正則表達式對單個字符,多個字符和匹配邊界等使用

瀏覽:83日期:2022-06-29 08:45:38

Regular Expression,正則表達式,又稱正規表示式、正規表示法、正則表達式、規則表達式、常規表示法(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),是計算機科學的一個概念。正則表達式是一個特殊的字符序列,它能幫助你方便的檢查一個字符串是否與某種模式匹配。在很多文本編輯器里,正則表達式通常被用來檢索、替換那些匹配某個模式的文本。

Python 自1.5版本起增加了re 模塊。re 模塊使 Python 語言擁有全部的正則表達式功能。

1.re.match函數

python用re.match函數從字符串的起始位置匹配一個模式,若字符串匹配正則表達式,則match方法返回匹配對象(Match Object),否則返回None(注意不是空字符串'')。匹配對象Macth Object具有group方法,用來返回字符串的匹配部分。

函數語法:re.match(pattern, string, flags) ;pattern是正則表達式,string需要匹配的字符串,flags為可選參數修飾符。

# 導入re模塊,注意match函數是從起始位置匹配的。如果起始位置匹配失敗,則返回Noneimport re#match()函數適合匹配是否以xxxx開始的字符串,因為其從頭開始匹配的ret = re.match('abc','aBCabc',re.I) #可選參數re.I表示忽略大小寫,后續詳細解釋。print(ret.group()) #aBCret1 = re.match('abc','aBCabc')print(ret1.group()) # ’NoneType’ object has no attribute ’group’

正則表達式可以包含一些可選標志修飾符來控制匹配的模式。修飾符被指定為一個可選的標志。多個標志可以通過按位 OR(|) 它們來指定。如 re.I | re.M 被設置成 I 和 M 標志:

修飾符 描述 re.I 使匹配對大小寫不敏感 re.L 做本地化識別(locale-aware)匹配 re.M 多行匹配,影響 ^ 和 $ re.S 使 . 匹配包括換行在內的所有字符 re.U 根據Unicode字符集解析字符。這個標志影響 w, W, b, B. re.X 該標志通過給予你更靈活的格式以便你將正則表達式寫得更易于理解。

2.正則表達式的語法2.1正則表達式對字符(單個字符)的表示

字符 功能 . 匹配任意1個字符(除了n),注意因為.表示任意一個字符,所以如果匹配‘.’則需要用轉義字符.來表示 [ ] 匹配[ ]中列舉的字符,如果[a-zA-Z0-9],[a-zA-Z]表示所有字母和數字,后者表示所有字母,注意中間沒有空格符號。 d 匹配數字,即0-9 D 匹配非數字,即不是數字 s 匹配空白,即 空格,tab鍵 S 匹配非空白 w 匹配單詞字符,即a-z、A-Z、0-9、_ W 匹配非單詞字符

# 導入re模塊import re#1.測試.的使用,匹配任意字符開始的字符串str=’abc’ret =re.match('..',str)print(ret.group()) #ab.用兩個..就表示只要str字符串開頭是兩個字符即可。ret1 = re.match('....',str) #這種情況則會報錯,因為str只有三個字符。 #2.匹配[]范圍內的任意一個字符開頭的字符串str1 = 'abcABC*?//'str2 = '3afasdlfadsf'ret2 = re.match('[a-z]',str1).group() #aret3 = re.match('[123456]',str2).group() #3,[1-6]等價[123456] #3./d的使用,表示匹配任意一個數字str3 = '第5名是我'ret4 = re.match('第d名',str3).group()print(ret4) #第5名 ret4 = re.match('第[0-9]名',str3) #同樣是表示0-9任意一個,[0-9]和d效果一樣print(ret4.group()) #第5名

總結:注意上面對字符的匹配都是表示一個任意字符,或者某個范圍內的任意一個字符,屬于單個字符匹配。而實際開發中肯定都是用一個子串(多個字符)去匹配整個字符串。那么如何表示呢,請繼續下去。

2.2正則表達式匹配多個字符:數量的表示

匹配多個字符的相關格式,其實就是單個字符加上數量。注意下面數量的匹配都是針對前一個字符。

字符 功能 * 匹配前一個字符出現0次或者無限次,即可有可無 + 匹配前一個字符出現1次或者無限次,即至少有1次 ? 匹配前一個字符出現1次或者0次,即要么有1次,要么沒有 {m} 匹配前一個字符出現m次 {m,} 匹配前一個字符至少出現m次 {m,n} 匹配前一個字符出現從m到n次

# 導入re模塊import re #1.匹配第一個是大寫字母,第二個小寫字母,后面只要是小寫字母即可。ret = re.match('[A-Z][a-z]*','Aafngsdfgnlsdf1224343')print(ret.group()) #Aafngsdfgnlsdfret1 = re.match('[A-Z][a-z]*','AaAaaa34bbb')print(ret1.group()) #Aa ,因為后面不是小寫字母所以沒匹配到。 #匹配下面字符串是否以字母或者下劃線開頭ret = re.match('[a-zA-Z_]+[w_]*','name1') #解釋1:[a-zA-Z_]+字母下劃線至少出現一次print(ret.group()) #name1 ret = re.match('[a-zA-Z_]+[w_]*','_name') #解釋2:[w_]*表示字母,數據下劃線出現任意次print(ret.group()) #_name ret = re.match('[a-zA-Z_]+[w_]*','2_name')#print(ret.group()) #報錯,因為匹配不上,返回None. #3.匹配前面字符出現0次或者1次使用?ret = re.match('[1-9]?[0-9]','7')print(ret.group()) #7 ret = re.match('[1-9]?[0-9]','33')print(ret.group()) #33 ret = re.match('[1-9]?[0-9]','09')print(ret.group()) #0 #4.前面字符出現n此,或者m-n范圍內的任意次ret = re.match('[a-zA-Z0-9_]{6}','dsa2A9nfdsf')print(ret.group()) #dsa2A9,匹配前6位是數字字符下劃線即可 ret = re.match('[a-zA-Z0-9_]{3,8}','aSjsd239344')ret1 = re.match('[a-zA-Z0-9_]{3,8}','aSjs')print(ret1.group()) #aSjs,注意匹配前一個字符出現3-8次,只要這個范圍內都算匹配成功,按實際匹配print(ret.group()) #aSjsd239 匹配前一個字符出現3到8次 ret = re.match('[a-z0-9A-Z_]{3,}','a2')print(ret.group()) #至少出現3次,所以如果只有兩個的話,返回None,調用報錯。

總結:單個字符匹配,多個字符匹配上面都已經演示過了,基本可以完成大多數字符串的匹配了。但是上面過于字符串的匹配都是從頭開始匹配的,而實際開發中可能是從字符串中間,后者結尾開始匹配的。keep reading....

2.3.正則表達式:匹配邊界的問題

字符 功能 ^ 匹配字符串開頭 $ 匹配字符串結尾 b匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, ’erb’ 可以匹配'never' 中的 ’er’,但不能匹配 'verb' 中的 ’er’。 B 匹配非單詞邊界,’erB’ 能匹配 'verb' 中的 ’er’,但不能匹配 'never' 中的 ’er’。

# 導入re模塊import re # 匹配以@qq.com郵箱結尾的郵箱地址#1.不適用匹配字符串結尾的$來實現,注意.要用轉義字符,一般郵箱的長度都是4-30位ret = re.match('[w]{4,30}@qq.com', 'xiaoWang@qq.com')print(ret.group()) #xiaoWang@qq.com # 通過$來確定末尾,效率更高ret = re.match('[w]{4,30}@qq.com$', 'xiaoWang@qq.com')print(ret.group()) #xiaoWang@qq.com ret = re.match('[w]{4,30}@qq.com$', 'xiaoWang@qq.com.cn')#print(ret.group()) #報錯

到此這篇關于Python中正則表達式對單個字符,多個字符和匹配邊界等使用的文章就介紹到這了,更多相關Python 單字符,多字符匹配內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Python 編程
国产综合久久一区二区三区