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