python正則表達式

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*>")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章