import re # findall # search # match # ret = re.findall('a','eva egon yuan') # # 返回所有滿足條件的結果,放在列表里 # print(ret) # ret = re.search('a','eva egon yuan') # if ret: # print(ret.group()) # # 從前往后,找到一個就返回,返回的變量需要調用group才能拿到結果 # # 如果沒有找到,那么返回None,調用group會報錯 # ret = re.match('[a-z]+','eva egon yuan') # if ret: # print(ret.group()) # # match是從頭開始匹配,如果正則從頭開始可以匹配上,就返回一個變量 # # 匹配的內容需要用group才能顯示 # # 如果沒匹配上,就返回None,調用group會報錯 # ret = re.split('[ab]','abcd') # print(ret) # ['', 'cd'] # # 先按'a'進行分割得到''和'bcd'.分別按'b'分割 # ret = re.sub('\d','H','eva3egon4yuan4',1) # print(ret) # # 將數字替換成'H’,參數1表示只替換1個 # ret = re.subn('\d','H','eva3egon4yuan4') # print(ret) # # 將數字替換成‘H',返回元組(替換的結果,替換了多少次) # compile 編譯正則表達式成為對象 # obj = re.compile('\d{3}') # # 將正則表達式編譯成為一個正則表達式對象,規則要匹配的是3個數字 # ret = obj.search('abc123eee') # 正則表達式對象調用search,參數為待匹配的字符串 # print(ret.group()) #結果:123 # finditer 迭代 # ret = re.finditer('\d','ds3su4784a') # finditer 返回一個匹配結果的迭代器 # # print(ret) # <callable_iterator object at 0x000001BC77390E48> # # print(next(ret).group()) # 查看第一個結果 # # print(next(ret).group()) # 查看第二個結果 # # print([i.group() for i in ret]) # 查看剩余的結果 # for i in ret: # print(i.group()) # 分組 # ret = re.search('^[1-9](\d{14})(\d{2}[0-9x])','411403198606166078') # print(ret.group()) # print(ret.group(1)) # print(ret.group(2)) # 正則表達式里有幾個分組就可以有幾個變量
注意:
1 findall的優先級查詢:
# ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com') # print(ret) # ['oldboy'] # 這是因為findall會優先把匹配結果組里內容返回,如果想要匹配結果,取消權限即可 # ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com') # print(ret) # ['www.oldboy.com']
2 split的優先級查詢
ret=re.split("\d+","eva3egon4yuan") print(ret) #結果 : ['eva', 'egon', 'yuan'] ret=re.split("(\d+)","eva3egon4yuan") print(ret) #結果 : ['eva', '3', 'egon', '4', 'yuan'] #在匹配部分加上()之后所切出的結果是不同的, #沒有()的沒有保留所匹配的項,但是有()的卻能夠保留了匹配的項, #這個在某些需要保留匹配部分的使用過程是非常重要的。
綜合練習與擴展
flags有很多可選值: re.I(IGNORECASE)忽略大小寫,括號內是完整的寫法 re.M(MULTILINE)多行模式,改變^和$的行為 re.S(DOTALL)點可以匹配任意字符,包括換行符 re.L(LOCALE)做本地化識別的匹配,表示特殊字符集 \w, \W, \b, \B, \s, \S 依賴於當前環境,不推薦使用 re.U(UNICODE) 使用\w \W \s \S \d \D使用取決於unicode定義的字符屬性。在python3中默認使用該flag re.X(VERBOSE)冗長模式,該模式下pattern字符串可以是多行的,忽略空白字符,並可以添加注釋