python中正則表示式的使用
正則表示式
python中需要使用正則表示式對字串進行匹配的時候,需要匯入re模組
#coding=utf-8
# 匯入re模組
import re
# 使用match方法進行匹配操作
result = re.match(正則表示式,要匹配的字串)
# 如果上一步匹配到資料的話,可以使用group方法來提取資料
result.group()
匹配單個字元
. 匹配任意1個字元(除了\n)
import re ret =re.match(r"haha.haha","hahaahaha") print(ret.group()) 輸出結果 hahaahaha
[ ] 匹配 [ ] 中列舉的字元
import re
ret = re.match("[0-9]Hello Python","7Hello Python")
print(ret.group())
輸出結果
7Hello Python
\d 匹配數字,即0-9 \D 匹配非數字,即不是數字
import re
ret = re.match(r"\d","1Hello Python")
print(ret.group())
ret = re.match(r"\D","Hello Python")
print(ret.group())
輸出結果
1
H
\s 匹配空白,即 空格,tab鍵 \S 匹配非空白
import re
ret = re.match(r"\s"," 1Hello Python")
print(ret.group())
ret = re.match(r"\S","Hello Python")
print(ret.group())
輸出結果
H
\w 匹配單詞字元,即a-z、A-Z、0-9、_ \W 匹配非單詞字元
import re ret = re.match(r"\w","1Hello Python") print(ret.group()) ret = re.match(r"\W","@Hello Python") print(ret.group()) 輸出結果 1 @
匹配多個字元
“ * ” 匹配一個字元出現0次或者無限次,即可有可無
import re
ret = re.match("[A-Z][a-z]*","M")
print(ret.group())
ret = re.match("[A-Z][a-z]*","MnnM")
print(ret.group())
ret = re.match("[A-Z][a-z]*","Aabcdef")
print(ret.group())
輸出結果
M
Mnn
Aabcdef
“ + ” 匹配一個字元出現一次或者無限次,即至少一次
import re
names = ["name1", "_name", "2_name", "__name__"]
for name in names:
ret = re.match("[a-zA-Z_]+[\w]*",name)
if ret:
print("變數名 %s 符合要求" % ret.group())
else:
print("變數名 %s 非法" % name)
輸出結果
變數名 name 符合要求
變數名 _name 符合要求
變數名 2_name 非法
變數名 __name__ 符合要求
" ? " 匹配一個字元出現一次或者0次
import re
ret = re.match("[1-9]?[0-9]","7")
print(ret.group())
ret = re.match("[1-9]?\d","33")
print(ret.group())
ret = re.match("[1-9]?\d","09")
print(ret.group())
輸出結果
7
33
0
{m} 匹配前一個字元出現m次 {m,n} 匹配前一個字元出現m 到 n 次
import re
ret = re.match("[a-zA-Z0-9_]{6}","12a3g45678")
print(ret.group())
ret = re.match("[a-zA-Z0-9_]{8,20}","1ad12f23s34455ff66")
print(ret.group())
輸出結果
12a3g4
1ad12f23s34455ff66
" ^ " 匹配字串開頭 " $ " 匹配字串結尾
email_list = ["[email protected]", "[email protected]", "[email protected]"]
for email in email_list:
ret = re.match("[\w]{4,20}@163\.com$", email)
if ret:
print("%s 是符合規定的郵件地址,匹配後的結果是:%s" % (email, ret.group()))
else:
print("%s 不符合要求" % email)
輸出結果
[email protected] 是符合規定的郵件地址,匹配後的結果是:[email protected]
[email protected] 不符合要求
[email protected] 不符合要求
" | " 匹配左右任意一個表示式
import re
ret = re.match("[1-9]?\d$|100","78")
print(ret.group())
ret = re.match("[1-9]?\d$|100","100")
print(ret.group())
輸出結果
78
100
(ab) 將括號中字元作為一個分組
import re
ret = re.match("\w{4,20}@(163|126|qq)\.com", "[email protected]")
print(ret.group())
輸出結果
[email protected]
\num 引用分組num匹配到的字串
import re
test_label = "<html>hh</htmlbalabala>"
ret = re.match(r"<([a-zA-Z]*)>\w*</\1>", test_label)
if ret:
print(ret.group())
else:
print("%s 這是一對不正確的標籤" % test_label)
輸出結果
<html>hh</htmlbalabala> 這是一對不正確的標籤
re模組的高階用法
match 匹配string 開頭,成功返回Match object, 失敗返回None,只匹配一個。 search 在string中進行搜尋,成功返回Match object, 失敗返回None, 只匹配一個。
import re
ret = re.search(r"\d+", "閱讀次數為 9999")
ret.group()
輸出結果
'9999'
findall 在string中查詢所有 匹配成功的組, 即用括號括起來的部分。返回list物件,每個list item是由每個匹配的所有組組成的list。
import re
ret = re.findall(r"\d+", "python = 9999, c = 7890, c++ = 12345")
print(ret)
輸出結果
['9999', '7890', '12345']
sub 將匹配到的資料進行替換
import re
ret = re.sub(r"\d+", '998', "python = 997")
print(ret)
輸出結果
python = 998
split 根據匹配進行切割字串,並返回一個列表
import re
ret = re.split(r":| ","info:xiaoZhang 33 shandong")
print(ret)
輸出結果
['info', 'xiaoZhang', '33', 'shandong']
python貪婪和非貪婪
Python裡數量詞預設是貪婪的(在少數語言裡也可能是預設非貪婪),總是嘗試匹配儘可能多的字元;
非貪婪則相反,總是嘗試匹配儘可能少的字元。
在"*","?","+","{m,n}"後面加上?,使貪婪變成非貪婪。
>>> re.match(r"aa(\d+)","aa2343ddd").group(1)
'2343'
>>> re.match(r"aa(\d+?)","aa2343ddd").group(1)
'2'
>>> re.match(r"aa(\d+)ddd","aa2343ddd").group(1)
'2343'
>>> re.match(r"aa(\d+?)ddd","aa2343ddd").group(1)
'2343'
>>>
r的作用
Python中字串前面加上 r 表示原生字串,
與大多數程式語言相同,正則表示式裡使用"“作為轉義字元,這就可能造成反斜槓困擾。假如你需要匹配文字中的字元”",那麼使用程式語言表示的正則表示式裡將需要4個反斜槓"\":前兩個和後兩個分別用於在程式語言裡轉義成反斜槓,轉換成兩個反斜槓後再在正則表示式裡轉義成一個反斜槓。
Python裡的原生字串很好地解決了這個問題,有了原生字串,你再也不用擔心是不是漏寫了反斜槓,寫出來的表示式也更直觀。
>>> ret = re.match(r"c:\\a",mm).group()
>>> print(ret)
c:\a