正則表達(dá)式的設(shè)計(jì)思想是用一種描述性的語言來給字符串定義一個(gè)規(guī)則,凡是符合規(guī)則的字符串,我們就認(rèn)為它“匹配”了,否則,該字符串就是不合法的。
-
\d可以匹配一個(gè)數(shù)字 -
\w可以匹配一個(gè)字母或數(shù)字 -
.可以匹配任意字符 - 用
*表示任意個(gè)字符(包括0個(gè)) - 用
+表示至少一個(gè)字符 - 用
?表示0個(gè)或1個(gè)字符 - 用
{n}表示n個(gè)字符,用{n,m}表示n-m個(gè)字符 -
\s可以匹配一個(gè)空格 -
[]表示范圍 -
A|B可以匹配A或B -
^表示行的開頭,$表示行的結(jié)束
re 模塊
Python提供re模塊,包含所有正則表達(dá)式的功能。
import re
test = '用戶輸入的字符串'
if re.match(r'正則表達(dá)式', test):
print('ok')
else:
print('failed')
切分字符串
用正則表達(dá)式切分字符串比用固定的字符更靈活,請(qǐng)看正常的切分代碼:
>>> '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']
分組
除了簡單地判斷是否匹配之外,正則表達(dá)式還有提取子串的強(qiáng)大功能。用()表示的就是要提取的分組(Group)。
>>> 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'
>>> m.groups()
('010', '12345')
貪婪匹配
正則匹配默認(rèn)是貪婪匹配,也就是匹配盡可能多的字符。
## 貪婪匹配
>>> re.match(r'^(\d+)(0*)$', '102300').groups()
('102300', '')
## 非貪婪匹配,使用?可以讓貪婪匹配轉(zhuǎn)換為非貪婪匹配
>>> re.match(r'^(\d+?)(0*)$', '102300').groups()
('1023', '00')
編譯
如果一個(gè)正則表達(dá)式要重復(fù)使用幾千次,出于效率的考慮,我們可以預(yù)編譯該正則表達(dá)式,接下來重復(fù)使用時(shí)就不需要編譯這個(gè)步驟了,直接匹配:
>>> 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')