Python中正則表達式進行匹配字符串,需要用到一個模塊re
re.match(r"正則表達式",匹配的字符串)
匹配成功則有返回值
即正則表達式爲一個規範,匹配就是進行驗證數據是否滿足我的規範
一,匹配單個字符
1.匹配相同字符:
re.match(r"test","test")
2.匹配單個數字的字符\d
:
re.match(r"test\d",“test2”)
re.match(r"test\d",“test3”)
當匹配test10時發現只匹配到了test1
可以發現\d只匹配單個數字
ret=re.match(r"test\d","test10") ret.group() 'test1'
3,匹配[]中列舉的字符
(re.match(r"[匹配數字組]",待匹配字符串)
)
re.match(r"test[12345678]","test9")
此時沒有返回值,說明匹配不成功
這段代碼和上面功能相同,但是隻有數字連續時才能用-
:
re.match(r"test[1-8]","test9")
4.匹配1-3 4-8的數字
:
re.match(r"test[1-34-8]","test9")
5.匹配數字字母組合:
re.match(r"test[1-8abc]","testa")
匹配結果:testa
記住一個原則:[]內的元素只匹配 一個
6,\w
匹配單詞字符即a-z,A-Z,0-9
同時也匹配中文,及其他國家的Unicode語言(不推薦用)
re.match(r"test\w","test啊")
7,匹配空格和tab鍵\s
re.match(r"test\s","test ")
二,匹配多個字符
1.\d{1,2}
匹配一位或兩位數字
re.match(r"test\d{1,2},"test1")
re.match(r"test\d{1,2},"test12")
2.\d{1,3}
匹配一位兩位或三位
re.match(r"test\d{1,3},"test1")
re.match(r"test\d{1,3},"test12")
re.match(r"test\d{1,3},"test123")
3.注意{}
指定的數字必須是連續的
4.?
匹配前一個字符出現一次或0次,即要麼有一次要麼0次
5. *
匹配前一個字符可以有0個有1個或者有n個,即可有可無
6.+
匹配前一個字符出現一次或無限次,即至少有一次
7. .
表示所以的字符,除了\n
8.{m}
匹配前一個字符出現m次
9.{m,n}
匹配前一個字符出現m到n次
re.match(r"021-?\d{8},"021-12345678")
re.match(r"021-?\d{8},"02112345678")
三,綜合運用:
1.匹配電話號
要求:匹配區號後面的-可有可無,區號爲3-4位
re.match(r"\d{3,4}-?\d{8},"0214-12345678") #電話區號可以有三位也可以有四位
re.match(r"\d{3,4}-?\d{8},"02212345678")
2.匹配html代碼
要求:匹配html文件所以內容,包括換行符
html="""sdfsf
asdfsfsafwe4
asdfsadf
sdfsdf
sdafs“”“
當執行
re.match(r".*,html)
時,我們想匹配到html內的所以內容,但是此時只匹配到了
sdfsf
這是因爲.
雖然表示的是所以的字符但是他卻不包含\n
即回車符,那麼我們怎麼才能匹配到所有的呢?
此時需要:
re.match(r".*,html,re.S)
在match裏增加一個參數re.S
即可讓.
中包括回車
此時就可匹配到html內的所以內容
3.匹配163郵箱
要求:@前面可以有英文字母,下劃線,數字,且爲4-20位
re.match(r"[a-zA-Z_0-9]{4,20}@163.com",str)
但是此時輸入123456@163acom
和 [email protected]
也會匹配成功,這是爲什麼呢?
因爲.
本身就是一個正則符號,表示所有的字符,所以,我們需要轉義字符\
同時用$
表示字符結束,即必須字符的結尾和表達式一模一樣,後面不能再有內容
re.match(r"[a-zA-Z_0-9]{4,20}@163\.com&",str)
即
\
代表轉義$
代表字符結束
三,匹配開頭結尾
1.$
表示匹配字符串結尾,即前面的正則表達式匹配完成後,到$
剛好爲結尾
2.^
表示匹配字符串開頭,從這之後開始進行正則匹配(Python自帶^說以不用寫)
re.match(r"^abc[123456]$",str)
上面一段代碼表示str必須以a爲開頭,以123456其中的任一個爲結尾,否則匹配失敗
四,分組等
指定特定匹配郵箱|
代表或
re.match(r"[a-zA-Z_0-9]{4,20}@(163|126).com",str)
此時就能匹配163或126
1.獲取分組內容分組:
()正則表達式可以取到括號內的內容
ret=re.match(r"[a-zA-Z_0-9]{4,20}@(163|126).com","[email protected]")
ret.group(1)
上面的代碼運行後,得到的結果爲:
126
即()通過group函數可以獲得第幾個小括號的內容:
ret=re.match(r"([a-zA-Z_0-9]{4,20})@(163|126).com","[email protected]")
ret.group(1)
運行上面代碼獲得的內容爲
12344
因爲此時第一個小括號加在了@前面
2.在正則表達式裏面使用分組內容:
html="<h1>hello</h1>"
re.match(r"<\w*>.*</\w*>")
此時可以匹配,
但是h1是一對標籤,我們怎麼才能實現匹配<h1>hello</h2>
這樣前後標籤名不相同的錯誤呢?
這時候我們可以利用分組:
html="<h1>hello</h1>"
re.match(r"<(\w*)>.*</\1*>")
在後面的\1
獲取分組1的內容,此時就能實現<h1>hello</h2>
這樣不符合規範的數據的識別
3.三給分組命名
給分組起名(注意爲小寫p):(?p<name>)
引用別名爲name的分組匹配的字符串(注意爲大P):(?P=name)
通過給分組命名上面的代碼可以改爲:
html="<h1>hello</h1>"
re.match(r"<(?p=h1\w*)>.*</?P=h1*>")