基礎(chǔ)
直接給出字符血筑,就是精確匹配
\d
匹配一個數(shù)字
\w
匹配一個字母或數(shù)字
.
匹配任意字符
*
表示任意個字符(包括0個)
+
表示至少一個字符
?
表示0個或1個字符
{n}
表示n個字符
{n,m}
表示n-m個字符
\s
匹配一個空格(也包括Tab等空白符)
正則特殊字符需要用\
轉(zhuǎn)義
[]
表示范圍如[0-9a-zA-Z_]可以匹配一個數(shù)字玻侥、字母或者下劃線炫刷;
A|B
可以匹配A或B 所以(P|p)ython可以匹配'Python'或者'python'
^
表示行的開頭,^\d表示必須以數(shù)字開頭云芦。
$
表示行的結(jié)束瓶颠,\d$表示必須以數(shù)字結(jié)束匾浪。
re模塊
判斷正則表達式是否匹配:
>>> import re
>>> re.match(r'^\d{3}\-\d{3,8}$', '010-12345')
<_sre.SRE_Match object; span=(0, 9), match='010-12345'>
>>> re.match(r'^\d{3}\-\d{3,8}$', '010 12345')
>>>
如果匹配成功,返回一個Match對象匈睁,否則返回None
test = '用戶輸入的字符串'
if re.match(r'正則表達式', test):
print('ok')
else:
print('failed')
切分字符串
>>> re.split(r'\s+', 'a b c')
['a', 'b', 'c']
>>> re.split(r'[\s\,\;]+', 'a,b;; c d')
['a', 'b', 'c', 'd']
分組
比如:
^(\d{3})-(\d{3,8})$分別定義了兩個組监透,可以直接從匹配的字符串中提取出區(qū)號和本地號碼:
>>> m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
>>> m
<_sre.SRE_Match object; span=(0, 9), match='010-12345'>
>>> m.group(0)
'010-12345'
>>> m.group(1)
'010'
>>> m.group(2)
'12345'
貪婪匹配
正則匹配默認是貪婪匹配,也就是匹配盡可能多的字符
匹配出數(shù)字后面的0
>>> re.match(r'^(\d+)(0*)$', '102300').groups()
('102300', '')
由于\d+采用貪婪匹配航唆,直接把后面的0全部匹配了胀蛮,結(jié)果`0*`只能匹配空字符串了。
必須讓`\d+`采用非貪婪匹配(也就是盡可能少匹配)糯钙,才能把后面的0匹配出來粪狼,加個`?`就可以讓`\d+`采用非貪婪匹配:
>>> re.match(r'^(\d+?)(0*)$', '102300').groups()
('1023', '00')
編譯
當我們在Python中使用正則表達式時,re模塊內(nèi)部會干兩件事情:
1任岸、編譯正則表達式再榄,如果正則表達式的字符串本身不合法,會報錯享潜;
2困鸥、用編譯后的正則表達式去匹配字符串。
如果一個正則表達式要重復使用幾千次剑按,出于效率的考慮疾就,我們可以預編譯該正則表達式,接下來重復使用時就不需要編譯這個步驟了吕座,直接匹配:
>>> import re
# 編譯:
>>> re_telephone = re.compile(r'^(\d{3})-(\d{3,8})$')
# 使用:
>>> re_telephone.match('010-12345').groups()
('010', '12345')
>>> re_telephone.match('010-8086').groups()
('010', '8086')
編譯后生成Regular Expression對象虐译,由于該對象自己包含了正則表達式,所以調(diào)用對應的方法時不用給出正則字符串吴趴。