Python中正則表達(dá)式對(duì)單個(gè)字符,多個(gè)字符和匹配邊界等使用
Regular Expression,正則表達(dá)式,又稱正規(guī)表示式、正規(guī)表示法、正則表達(dá)式、規(guī)則表達(dá)式、常規(guī)表示法(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),是計(jì)算機(jī)科學(xué)的一個(gè)概念。正則表達(dá)式是一個(gè)特殊的字符序列,它能幫助你方便的檢查一個(gè)字符串是否與某種模式匹配。在很多文本編輯器里,正則表達(dá)式通常被用來檢索、替換那些匹配某個(gè)模式的文本。
Python 自1.5版本起增加了re 模塊。re 模塊使 Python 語言擁有全部的正則表達(dá)式功能。
1.re.match函數(shù)
python用re.match函數(shù)從字符串的起始位置匹配一個(gè)模式,若字符串匹配正則表達(dá)式,則match方法返回匹配對(duì)象(Match Object),否則返回None(注意不是空字符串"")。匹配對(duì)象Macth Object具有g(shù)roup方法,用來返回字符串的匹配部分。
函數(shù)語法:re.match(pattern, string, flags) ;pattern是正則表達(dá)式,string需要匹配的字符串,flags為可選參數(shù)修飾符。
# 導(dǎo)入re模塊,注意match函數(shù)是從起始位置匹配的。如果起始位置匹配失敗,則返回None import re #match()函數(shù)適合匹配是否以xxxx開始的字符串,因?yàn)槠鋸念^開始匹配的 ret = re.match("abc","aBCabc",re.I) #可選參數(shù)re.I表示忽略大小寫,后續(xù)詳細(xì)解釋。 print(ret.group()) #aBC ret1 = re.match("abc","aBCabc") print(ret1.group()) # 'NoneType' object has no attribute 'group'
正則表達(dá)式可以包含一些可選標(biāo)志修飾符來控制匹配的模式。修飾符被指定為一個(gè)可選的標(biāo)志。多個(gè)標(biāo)志可以通過按位 OR(|) 它們來指定。如 re.I | re.M 被設(shè)置成 I 和 M 標(biāo)志:
修飾符 | 描述 |
---|---|
re.I | 使匹配對(duì)大小寫不敏感 |
re.L | 做本地化識(shí)別(locale-aware)匹配 |
re.M | 多行匹配,影響 ^ 和 $ |
re.S | 使 . 匹配包括換行在內(nèi)的所有字符 |
re.U | 根據(jù)Unicode字符集解析字符。這個(gè)標(biāo)志影響 \w, \W, \b, \B. |
re.X | 該標(biāo)志通過給予你更靈活的格式以便你將正則表達(dá)式寫得更易于理解。 |
2.正則表達(dá)式的語法
2.1正則表達(dá)式對(duì)字符(單個(gè)字符)的表示
字符 | 功能 |
---|---|
. | 匹配任意1個(gè)字符(除了\n),注意因?yàn)?表示任意一個(gè)字符,所以如果匹配‘.'則需要用轉(zhuǎn)義字符\.來表示 |
[ ] | 匹配[ ]中列舉的字符,如果[a-zA-Z0-9],[a-zA-Z]表示所有字母和數(shù)字,后者表示所有字母,注意中間沒有空格符號(hào)。 |
\d | 匹配數(shù)字,即0-9 |
\D | 匹配非數(shù)字,即不是數(shù)字 |
\s | 匹配空白,即 空格,tab鍵 |
\S | 匹配非空白 |
\w | 匹配單詞字符,即a-z、A-Z、0-9、_ |
\W | 匹配非單詞字符 |
# 導(dǎo)入re模塊 import re #1.測(cè)試.的使用,匹配任意字符開始的字符串 str='abc' ret =re.match("..",str) print(ret.group()) #ab.用兩個(gè)..就表示只要str字符串開頭是兩個(gè)字符即可。 ret1 = re.match("....",str) #這種情況則會(huì)報(bào)錯(cuò),因?yàn)閟tr只有三個(gè)字符。 #2.匹配[]范圍內(nèi)的任意一個(gè)字符開頭的字符串 str1 = "abcABC*?//" str2 = "3afasdlfadsf" ret2 = re.match("[a-z]",str1).group() #a ret3 = re.match("[123456]",str2).group() #3,[1-6]等價(jià)[123456] #3./d的使用,表示匹配任意一個(gè)數(shù)字 str3 = "第5名是我" ret4 = re.match("第\d名",str3).group() print(ret4) #第5名 ret4 = re.match("第[0-9]名",str3) #同樣是表示0-9任意一個(gè),[0-9]和\d效果一樣 print(ret4.group()) #第5名
總結(jié):注意上面對(duì)字符的匹配都是表示一個(gè)任意字符,或者某個(gè)范圍內(nèi)的任意一個(gè)字符,屬于單個(gè)字符匹配。而實(shí)際開發(fā)中肯定都是用一個(gè)子串(多個(gè)字符)去匹配整個(gè)字符串。那么如何表示呢,請(qǐng)繼續(xù)下去。
2.2正則表達(dá)式匹配多個(gè)字符:數(shù)量的表示
匹配多個(gè)字符的相關(guān)格式,其實(shí)就是單個(gè)字符加上數(shù)量。注意下面數(shù)量的匹配都是針對(duì)前一個(gè)字符。
字符 | 功能 |
---|---|
* | 匹配前一個(gè)字符出現(xiàn)0次或者無限次,即可有可無 |
+ | 匹配前一個(gè)字符出現(xiàn)1次或者無限次,即至少有1次 |
? | 匹配前一個(gè)字符出現(xiàn)1次或者0次,即要么有1次,要么沒有 |
{m} | 匹配前一個(gè)字符出現(xiàn)m次 |
{m,} | 匹配前一個(gè)字符至少出現(xiàn)m次 |
{m,n} | 匹配前一個(gè)字符出現(xiàn)從m到n次 |
# 導(dǎo)入re模塊 import re #1.匹配第一個(gè)是大寫字母,第二個(gè)小寫字母,后面只要是小寫字母即可。 ret = re.match("[A-Z][a-z]*","Aafngsdfgnlsdf1224343") print(ret.group()) #Aafngsdfgnlsdf ret1 = re.match("[A-Z][a-z]*","AaAaaa34bbb") print(ret1.group()) #Aa ,因?yàn)楹竺娌皇切懽帜杆詻]匹配到。 #匹配下面字符串是否以字母或者下劃線開頭 ret = re.match("[a-zA-Z_]+[\w_]*","name1") #解釋1:[a-zA-Z_]+字母下劃線至少出現(xiàn)一次 print(ret.group()) #name1 ret = re.match("[a-zA-Z_]+[\w_]*","_name") #解釋2:[\w_]*表示字母,數(shù)據(jù)下劃線出現(xiàn)任意次 print(ret.group()) #_name ret = re.match("[a-zA-Z_]+[\w_]*","2_name") #print(ret.group()) #報(bào)錯(cuò),因?yàn)槠ヅ洳簧?,返回None. #3.匹配前面字符出現(xiàn)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.前面字符出現(xiàn)n此,或者m-n范圍內(nèi)的任意次 ret = re.match("[a-zA-Z0-9_]{6}","dsa2A9nfdsf") print(ret.group()) #dsa2A9,匹配前6位是數(shù)字字符下劃線即可 ret = re.match("[a-zA-Z0-9_]{3,8}","aSjsd239344") ret1 = re.match("[a-zA-Z0-9_]{3,8}","aSjs") print(ret1.group()) #aSjs,注意匹配前一個(gè)字符出現(xiàn)3-8次,只要這個(gè)范圍內(nèi)都算匹配成功,按實(shí)際匹配 print(ret.group()) #aSjsd239 匹配前一個(gè)字符出現(xiàn)3到8次 ret = re.match("[a-z0-9A-Z_]{3,}","a2") print(ret.group()) #至少出現(xiàn)3次,所以如果只有兩個(gè)的話,返回None,調(diào)用報(bào)錯(cuò)。
總結(jié):單個(gè)字符匹配,多個(gè)字符匹配上面都已經(jīng)演示過了,基本可以完成大多數(shù)字符串的匹配了。但是上面過于字符串的匹配都是從頭開始匹配的,而實(shí)際開發(fā)中可能是從字符串中間,后者結(jié)尾開始匹配的。keep reading....
2.3.正則表達(dá)式:匹配邊界的問題
字符 | 功能 | |
---|---|---|
^ | 匹配字符串開頭 | |
$ | 匹配字符串結(jié)尾 | |
\b |
|
|
\B | 匹配非單詞邊界,'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。 |
# 導(dǎo)入re模塊 import re # 匹配以@qq.com郵箱結(jié)尾的郵箱地址 #1.不適用匹配字符串結(jié)尾的$來實(shí)現(xiàn),注意.要用轉(zhuǎn)義字符,一般郵箱的長度都是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()) #報(bào)錯(cuò)
到此這篇關(guān)于Python中正則表達(dá)式對(duì)單個(gè)字符,多個(gè)字符和匹配邊界等使用的文章就介紹到這了,更多相關(guān)Python 單字符,多字符匹配內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python通過TensorFLow進(jìn)行線性模型訓(xùn)練原理與實(shí)現(xiàn)方法詳解
這篇文章主要介紹了Python通過TensorFLow進(jìn)行線性模型訓(xùn)練原理與實(shí)現(xiàn)方法,結(jié)合實(shí)例形式詳細(xì)分析了Python通過TensorFLow進(jìn)行線性模型訓(xùn)練相關(guān)概念、算法設(shè)計(jì)與訓(xùn)練操作技巧,需要的朋友可以參考下2020-01-01python基于pygame實(shí)現(xiàn)響應(yīng)游戲中事件的方法(附源碼)
這篇文章主要介紹了python基于pygame實(shí)現(xiàn)響應(yīng)游戲中事件的方法,實(shí)例分析了Python基于pygame針對(duì)鍵盤及鼠標(biāo)事件的響應(yīng)方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11Python程序中使用SQLAlchemy時(shí)出現(xiàn)亂碼的解決方案
這篇文章主要介紹了Python程序中使用SQLAlchemy時(shí)出現(xiàn)亂碼的解決方案,SQLAlchemy是Python常用的操作MySQL數(shù)據(jù)庫的工具,需要的朋友可以參考下2015-04-04python中delattr刪除對(duì)象方法的代碼分析
在本篇文章里小編給大家分享了一篇關(guān)于python中delattr刪除對(duì)象方法的代碼分析內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2020-12-12詳解model.train()和model.eval()兩種模式的原理與用法
這篇文章主要介紹了詳解model.train()和model.eval()兩種模式的原理與用法,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,那么看完這篇文章一定會(huì)對(duì)你有所幫助2023-03-03python文字轉(zhuǎn)語音的實(shí)例代碼分析
在本篇文章里小編給大家整理的是關(guān)于python文字轉(zhuǎn)語音的實(shí)例代碼分析,有需要的朋友們可以參考下。2019-11-11Python OpenCV中的resize()函數(shù)的使用
這篇文章主要介紹了Python OpenCV中的resize()函數(shù)的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06