python常用模組之re模組(正則)

2022-01-15 09:10:11 字數 4773 閱讀 4016

python種的re模組常用的5種方法,分別是re.match   re.search  re.findall  re.split  re.sub。

在介紹五種方法之前,需要介紹一下正則的基礎。

.  表示任意字元,除\n以為

\ 轉義字元

[...] 字符集,表示取其中任意乙個字元。比如[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模組的常用方法。

一,re.match   嘗試從字串的起始位置匹配乙個模式,如果不是起始位置匹配成功的話,match()就返回none。

re模組可以直接使用對應的方法,比如

import re

res = re.match('\d+','123abc123')

if res:

print(res.group())

這樣就可以匹配到就是123,所以輸出的則是123.

但是一般使用re模組的步驟通常是 將正規表示式的字串編譯為pattern例項,然後使用pattern例項處理文字並獲得匹配結果,最後使用對應方法處理。通俗的就是要使用正則,先建立正則規則,然後編譯成物件。最種使用正則的對應方法處理即可。

這樣的好處就是速度更快。

所以上述**更新為:

import re

pattern = re.compile('\d+')

res = re.match(pattr, '123abc123')

if res:

print(res.group())

為了更直觀的顯示時間的區別,附上時間差的對比:

import time

import 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 re

pattern = 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())

0 表示輸出匹配到的所有,即預設所以輸出的結果為123abc123

1 表示輸出第乙個括號匹配到的內容,即123

2表示輸出第二個括號匹配到的內容,即abc

3表示輸出第三個括號匹配到的內容,即123

groups() 返回所有小組匹配到的內容,以元祖的形式輸出。即(123,abc,123)

切記:match是從第一字元開始匹配,如果匹配不到,直接返回none.

二,re.search  

re.search  掃瞄整個字串並返回第乙個成功的匹配

import re

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_

可以發現,即使search沒有匹配到123,但是它還是會往後匹配,而不是直接返回none。再看如下**:

import re

pattern = re.compile('[a-z]+')

res = re.search(pattern,'123abc123abd')

if res:

print(res.group())

輸出結果:abc

可見,search匹配整個字串,找到第乙個就會輸出。後面的則不匹配。

簡單小結:

re.match只匹配字串的開始,如果字串開始不符合正規表示式,則匹配失敗,函式返回none;而re.search匹配整個字串,直到找到乙個匹配。

三,re.findall   在字串中找到正規表示式所匹配的所有子串,並返回乙個列表,如果沒有找到匹配的,則返回空列表。findall是沒有group方法的。

import re

pattern = re.compile('[a-z]+')

res = re.findall(pattern,'123abc123abd')

print(res)

輸出結果:['abc', 'abd']

可見該正則會將匹配到內容按列表的形式輸出,它不僅僅是匹配一次,這個是它和search的區別 

四, re.split 匹配分割字串

import re

pattern = re.compile('[a-z]+')

res = re.split(pattern,'123abc123abd')

print(res)

輸出結果:['123', '123', '']

五, re.sub 匹配替換

import re

pattern = re.compile('[a-z]+')

res = re.sub(pattern,'000','123abc123')

print(res)

輸出結果:123000123

值得注意的是:正則中* + 都是貪婪匹配,?是非貪婪匹配。所以如果你要想要限制住*的貪婪匹配,可以在*的後面新增?來限制。比如

line = '手機號:15200000000,生日:0802'

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,生日:

手機號:

可見,?是可以限制住*的貪婪匹配的!!!

裝b可用:分組,可以給匹配到的內容設定名稱生成字典。

import re

re = 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...