python - re模塊(正則表達式)
元字符介紹:
. 單個字符匹配
^ 以字符開頭匹配 在[]裏面作為非
$ 以字符結尾匹配
A|B 匹配A或者B的字符串
註意 : |
>>> re.findall(r"\d+@(?:qq|163).com","[email protected]@qq.combfew") [‘[email protected]‘, ‘[email protected]‘]
* (0,無窮多)重復匹配符號前字符
+ (1,無窮多)重復匹配符號前字符
? (0,1)重復匹配符號前字符
*和+區別:
>>> re.findall("aaf*","dwaadhtfhdw") [‘aa‘] >>> re.findall("aaf+","dwaadhtfhdw") []
{} 重復萬金油
{0,}等同於 *
{1,}等同於+
{0,1}等同於?
{3}重復3次
[] 匹配大括號內的字符
[a] 匹配大廓內的字符一次
[a-z] 匹配a-z中任意字符一次
[0-9] 匹配0-9中任意字符一次
[^a-z] 非字符a-z一次
>>> re.findall("\([^()]*\)",‘2*(3+(2*4-(9+4)))‘) [‘(9+4)‘] >>> #找到最內層的括號
分組
() 將數據分組匹配
(?P<name>) 命名分組
#在運行分組的時候千萬要註意!!!!!!!!!!!!!
>>> re.findall("(abc)","abcabcabc") [‘abc‘, ‘abc‘, ‘abc‘] >>> re.findall("(abc)+","abcabcabc") [‘abc‘] >>> re.findall("(?:abc)","abcabcabc") [‘abc‘, ‘abc‘, ‘abc‘] >>> re.findall("(?:abc)+","abcabcabc") [‘abcabcabc‘] >>>
#應用分組後,匹配規則優先反饋分組內的數據.
應用:
re.search().group(name)
>>> re.search(r"(?P<zjm>主機名)(?P<id>\w{2}\d+)","主機名PC201808110908n7旗艦版").group("zjm") ‘主機名‘ >>> re.search(r"(?P<zjm>主機名)(?P<id>\w{2}\d+)","主機名PC201808110908n7旗艦版").group("id") ‘PC201808110908‘ >>>
特殊符號:
\d 匹配數字,[0-9]
\D 匹配任何非數據[^0-9]
\s 匹配任何空白字符,[\t\n\r\f\v]
\S 匹配任何非空白字符,[^\t\n\r\f\v]
\w 匹配任何字母數字,[a-zA-Z0-9]
\W 匹配任何非字符數字[^a-zA-Z0-9]
\b 匹配一個reshuffle字符邊界,空格,&,#等
re 方法:
import re #導入模塊
re.findall() 找到匹配數據,返回一個 列表類型
re.match() 找到匹配數據,返回一個對象(包含匹配字符位置以及字符) 可以group取出數據
re.split() 找到匹配數據,已找到數據分割
re.sub() 參數:re.sub("匹配規則","替換規則",字符串,替換次數)
compile方法
obj = re.compile
obj.re方法(字符串)
>>> obj = re.compile("\d") >>> obj.findall("123dasda323432") [‘1‘, ‘2‘, ‘3‘, ‘3‘, ‘2‘, ‘3‘, ‘4‘, ‘3‘, ‘2‘] >>>
re.finditer() 將匹配到的數據轉換成生成器. .__next__.group()獲取數據.
練習題:
郵箱地址匹配:
import re #從中找到4條郵箱地址: #識別模式:數字+@+qq|163|135.com msg = "sdfefsefEGDFSBD234T37YCUN32JF6SC5621RKI9JSF455342229@[email protected]@[email protected]" #以列表形式返回: email = re.findall("(\d+@(?:163|qq|135).com)",msg) print(email) #以單條數據返回 email2 = re.finditer("(\d+@(?:163|qq|135).com)",msg) print(next(email2).group()) print(next(email2).group()) print(next(email2).group()) print(next(email2).group())
python - re模塊(正則表達式)