Python3學習筆記18 re模組

2021-09-17 20:25:05 字數 3190 閱讀 5983

python提供re模組,包含所有正規表示式的功能。由於python的字串本身也用\轉義,所以要特別注意:

s=『abc\-001』 #python的字串

#對應的正規表示式字串變成:

#』abc-001』

因此我們強烈建議使用python的r字首,就不用考慮轉義的問題:

s=r』abc-001』 #python的字串

#對應的正規表示式字串不變:

#『abc-001』

先看看如何判斷正規表示式是否匹配:

import re

a=re.match(r'^\d\-\d$','010-12345')

b=re.match(r'^\d\-\d$','010 12345')

print(a)

print(b)

輸出結果:

none

match方法判斷是否匹配,如果匹配成功,返回乙個match物件,否則返回none。常見的判斷方法就是:

import re

test=input('請輸入使用者名稱:')

if re.match(r'\d\\\w',test):

print('ok')

else:

print('failed')

切分字串

用正規表示式切分字串比用固定的字串更靈活,請看正常的切分**:

>>> 'a b     c'.split(' ')

['a', 'b', '', '', '', '', 'c']

嗯,無法識別連續的空格,用正規表示式試試:

>>> re.split(r'\s+','a  b       c')

['a', 'b', 'c']

無論多少個空格都可以正常分割。加入,試試:

>>> re.split(r'[\s\,]+','a,b, c d')

['a', 'b', 'c', 'd']

再加入;試試:

>>> re.split(r'[\s\,\;]+','a,b;;  c    d')

['a', 'b', 'c', 'd']

如果使用者輸入了一組標籤,下次記得用正規表示式來把不規範的輸入轉化成正確的陣列。

分組

除了簡單地判斷是否匹配之外,正規表示式還有提取字串的強大功能。用()表示的就是要提取的分組(group)。比如:

>>> m=re.match(r'^(\d)-(\d)$','010-12345')

>>> m

>>> m.group(0)

'010-12345'

>>> m.group(1)

'010'

>>> m.group(2)

'12345'

如果正規表示式中定義了組,就可以在match物件上用group()方法提取出字串來。

注意到group(0)永遠是原始字串,group(1)、group(2)……表示第1、2、……個字串。

提取字串非常有用。來看乙個更**的例子:

import re

t='19:05:30'

m=re.match(r'^(0[0-9]|1[0-9]|2[0-3]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$',t)

print(m.groups())

print(m.group(1))

print(m.group(2))

print(m.group(3))

輸出結果:

(『19』, 『05』, 『30』)

1905

30這個正規表示式可以直接識別合法的時間。但是有些時候,用正規表示式也無法做到完全驗證,比如識別日期:

'^(0[1-9]|1[0-2]|[0-9])-(0[1-9]|1[0-9]|2[0-9]|3[0-1]|[0-9])

對於』2-30『,』4-31『這樣的非法日期,用正則還是識別不了,或者說寫出來非常困難,這時就需要程式配合識別了。

貪婪匹配

最後需要特別指出的是,正則匹配預設是貪婪匹配,也就是匹配盡可能多的字元。舉例如下,匹配出數字後面的0:

re.match(r'^(\d+)(0*)$','102300').groups()

('102300', '')

由於\d+採用貪婪匹配,直接把後面的0全部匹配了,結果0*只能匹配空字串了。

必須讓\d+採用非貪婪匹配(也就是盡可能少匹配),才能把後面的0匹配出來,加個?就可以讓\d+採用非貪婪匹配:

>>> re.match(r'^(\d+?)(0*)$','102300').groups()

('1023', '00')

編譯

當我們在python中使用正規表示式時,re模組內部會幹兩件事情:

1、編譯正規表示式,如果正規表示式的字串本身不合法,會報錯;

2、用編譯後的正規表示式去匹配字串。

如果乙個正規表示式要重複使用幾千次,出於效率考慮,我們可以預編譯該正規表示式,接下來重複使用時就不需要編譯這個步驟了,直接匹配:

import re

#編譯re_telephone=re.compile(r'^(\d)\-(\d)$')

#使用a=re_telephone.match('010-12345').groups()

b=re_telephone.match('010-0809').groups()

print(a)

print(b)

輸出結果:

(『010』, 『12345』)

(『010』, 『0809』)

編譯後生成regular expression物件,由於該物件自己包含了正規表示式,所以呼叫對應的方法時不用給出正則字串。

小結正規表示式非常強大,要在短短的一節裡講完是不可能的。要講清楚正則的所有內容,可以寫一本厚厚的書了。如果你經驗遇到正規表示式的問題,你可能需要一本正規表示式的參考書。

Python3基礎筆記 re模組

參考部落格 py西遊攻關之模組 就其本質而言,正規表示式 或 re 是一種小型的 高度專業化的程式語言,在python中 它內嵌在python中,並通過 re 模組實現。正規表示式模式被編譯成一系列的位元組碼,然後由用 c 編寫的匹配引擎執行。importre 萬用字元,乙個 模糊匹配乙個除換行符之...

Python3學習筆記

最近在起步學python,聚合一下這個過程中蒐集的資源和對一些基本知識做個小總結,語法基於python3,方便以後查詢。python官方文件 不錯的基礎課程 基本語法 演算法 建模 練習 以下是整理常用可能遺忘的基礎點 python3中的輸入是input 獲得使用者輸入的字串 a input ple...

python3學習筆記

redis訊息佇列的使用 coding utf 8 created on tue mar 26 15 58 34 2019 author admin import redis class redisqueue object def init self,name,namespace queue red...