修飾符 | 描述 |
---|---|
re.I | 使匹配對大小寫不敏感 |
re.L | 做本地化識別(locale-aware)匹配 |
re.M | 多行匹配,影響 ^ 和 $ |
re.S | 使 . 匹配包括換行在內的所有字符 |
re.U | 根據Unicode字符集解析字符。這個標志影響 \w, \W, \b, \B. |
re.X | 該標志通過給予你更靈活的格式以便你將正則表達式寫得更易于理解。 |
字符 | 功能 |
---|---|
. | 匹配任意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() #a ret3 = 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名
總結:注意上面對字符的匹配都是表示一個任意字符,或者某個范圍內的任意一個字符,屬于單個字符匹配。而實際開發中肯定都是用一個子串(多個字符)去匹配整個字符串。那么如何表示呢,請繼續下去。
匹配多個字符的相關格式,其實就是單個字符加上數量。注意下面數量的匹配都是針對前一個字符。
字符 | 功能 |
---|---|
* | 匹配前一個字符出現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()) #Aafngsdfgnlsdf ret1 = 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....
字符 | 功能 | |
---|---|---|
^ | 匹配字符串開頭 | |
$ | 匹配字符串結尾 | |
\b |
|
|
\B | 匹配非單詞邊界,'er\B' 能匹配 "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 單字符,多字符匹配內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!