python種的re模組常用的5種方法,分別是re.match re.search re.findall re.split re.sub。
在介紹五種方法之前,需要介紹一下正則的基礎。
. 表示任意字元,除\n以為上述介紹了正則的一些基本語法。下面介紹的是re模組的常用方法。\ 轉義字元
[...] 字符集,表示取其中任意乙個字元。比如[abc]d 可以匹配到ad bd cd。
\d 表示數字,等同於[0-9]
\d 表示非數字 [^\d]
\s 表示空格
\s 表示非空格
\w 表示單詞字元 [a-za-z_0-9]
\w 表示非單詞字元 [^\w]
* 匹配前面0個或多個字元
+ 匹配前面1個或多個字元
? 匹配前面0個或1個字元
匹配前面m個字元
匹配前1個字元m至n次
^ 匹配以什麼開頭
$ 匹配以什麼結尾
\a 匹配以什麼開頭
\z 匹配以什麼結尾
| 或 左右表示式取乙個 abc|def
(..) 表示乙個整體,(abc) 匹配abc2次
(?p)分組命名 比如(?ptom)
\(number) 引用編號為number的分組 比如:(\d)abc\1 1abc1
一,re.match 嘗試從字串的起始位置匹配乙個模式,如果不是起始位置匹配成功的話,match()就返回none。
re模組可以直接使用對應的方法,比如
import re這樣就可以匹配到就是123,所以輸出的則是123.res = re.match('\d+','123abc123')
if res:
print(res.group())
但是一般使用re模組的步驟通常是 將正規表示式的字串編譯為pattern例項,然後使用pattern例項處理文字並獲得匹配結果,最後使用對應方法處理。通俗的就是要使用正則,先建立正則規則,然後編譯成物件。最種使用正則的對應方法處理即可。
這樣的好處就是速度更快。
所以上述**更新為:
import re為了更直觀的顯示時間的區別,附上時間差的對比:pattern = re.compile('\d+')
res = re.match(pattr, '123abc123')
if res:
print(res.group())
import timeimport re
def timeer(fun):
start_time = time.time()
fun()
stop_time = time.time()
print('函式執行時間為'.format(fun.__name__,stop_time-start_time))
上面的re.group()這裡其實是可以填寫對應的數值的。預設就是0,代表輸出匹配到所有字元。
import re0 表示輸出匹配到的所有,即預設所以輸出的結果為123abc123pattern = re.compile('(\d+)([a-z]+)(\d+)')
res = re.match(pattern,'123abc123')
if res:
print(res.group(0))
print(res.group(1))
print(res.group(2))
print(res.group(3))
print(res.groups())
1 表示輸出第乙個括號匹配到的內容,即123
2表示輸出第二個括號匹配到的內容,即abc
3表示輸出第三個括號匹配到的內容,即123
groups() 返回所有小組匹配到的內容,以元祖的形式輸出。即(123,abc,123)
切記:match是從第一字元開始匹配,如果匹配不到,直接返回none.
二,re.search
re.search 掃瞄整個字串並返回第乙個成功的匹配
import re可以發現,即使search沒有匹配到123,但是它還是會往後匹配,而不是直接返回none。再看如下**:pattern = re.compile('[a-z]+(\d+)(\w+)')
res = re.search(pattern,'123abc123_')
if res:
print(res.group())
print(res.group(1))
print(res.group(2))
輸出結果:
abc123_
123_
import re可見,search匹配整個字串,找到第乙個就會輸出。後面的則不匹配。pattern = re.compile('[a-z]+')
res = re.search(pattern,'123abc123abd')
if res:
print(res.group())
輸出結果:abc
簡單小結:
re.match只匹配字串的開始,如果字串開始不符合正規表示式,則匹配失敗,函式返回none;而re.search匹配整個字串,直到找到乙個匹配。
三,re.findall 在字串中找到正規表示式所匹配的所有子串,並返回乙個列表,如果沒有找到匹配的,則返回空列表。findall是沒有group方法的。
import re可見該正則會將匹配到內容按列表的形式輸出,它不僅僅是匹配一次,這個是它和search的區別pattern = re.compile('[a-z]+')
res = re.findall(pattern,'123abc123abd')
print(res)
輸出結果:['abc', 'abd']
四, re.split 匹配分割字串
import re五, re.sub 匹配替換pattern = re.compile('[a-z]+')
res = re.split(pattern,'123abc123abd')
print(res)
輸出結果:['123', '123', '']
import re值得注意的是:正則中* + 都是貪婪匹配,?是非貪婪匹配。所以如果你要想要限制住*的貪婪匹配,可以在*的後面新增?來限制。比如pattern = re.compile('[a-z]+')
res = re.sub(pattern,'000','123abc123')
print(res)
輸出結果:123000123
line = '手機號:15200000000,生日:0802'裝b可用:分組,可以給匹配到的內容設定名稱生成字典。reg_str1 = '.*:'
reg_str2 = '.*?:'
match_obj1 = re.match(reg_str1,line)
match_obj2 = re.match(reg_str2,line)
if match_obj1:
print(match_obj1.group())
if match_obj2:
print(match_obj2.group())
輸出結果:
手機號:15200000000,生日:
手機號:
可見,?是可以限制住*的貪婪匹配的!!!
import rere = re.search('(?p[0-9]+)(?p[a-za-z]+)','abcd1233bob@34')
if re:
print(re.group())
print(re.groupdict())
輸出結果:
1233bob
#比如匹配身份證,import re
id = '360201199011113721'
res = re.search('(?p[0-9])(?p[0-9])(?p[0-9])(?p[0-9])(?p[0-9])(?p[0-9])(?p[0-9])',id)
if res:
print(res.group())
print(res.groupdict())
輸出結果:
360201199011113721
python常用模組之 正則re模組
python中使用正規表示式的步驟 1.匯入re模組 import re 2.初始化乙個regex物件 re.compile 3.剛剛建立的regex物件呼叫search方法進行匹配,返回要給march物件 4.剛剛的march物件呼叫group方法,展示匹配到的字串 下面例子的知識點 對正規表示式...
常用模組之re模組
正規表示式是一門獨立語言 是通過一些特殊符號使用,從而在字串中篩選出想要的結果 如果想在python中使用正則,則需借助於內建模組re 字元組 包含乙個字元或者的意思 a z a z中任意取乙個字元 a z a z中任意取乙個字元 0 9 0 9中任意取乙個字元 特殊符號 特殊符號預設也只能單個單個...
Python常用模組之re
2 python正則常用模組 2.1 re.match與re.search 函式說明 re.match 嘗試從字串的起始位置匹配乙個模式,如果不是起始位置匹配成功的話,match 就返回none。re.search 掃瞄整個字串並返回第乙個成功的匹配。函式語法 re.match pattern,st...