正則表達(dá)式是一種用來(lái)匹配字符串的強(qiáng)有力的武器疙筹。它的設(shè)計(jì)思想是用一種描述性的語(yǔ)言來(lái)給字符串定義一個(gè)規(guī)則沛硅,凡是符合規(guī)則的字符串,我們就認(rèn)為它“匹配”了扎拣,否則赴肚,該字符串就是不合法的素跺。
因?yàn)檎齽t表達(dá)式也是用字符串表示的二蓝,所以,我們要首先了解如何用字符來(lái)描述字符指厌。
正則表達(dá)式匹配:
如果直接給出字符刊愚,就是精確匹配。
?\d 可以匹配一個(gè)數(shù)字
\w 可以匹配一個(gè)字母或數(shù)字
?.?可以匹配任意字符
要匹配變長(zhǎng)的字符踩验,在正則表達(dá)式中:
用 * 表示任意個(gè)字符(包括0個(gè))
用 + 表示至少一個(gè)字符
用 ? 表示0個(gè)或1個(gè)字符
用 {n} 表示n個(gè)字符
用 {n,m} 表示n-m個(gè)字符
特殊字符 要用'\'轉(zhuǎn)義
正則表達(dá)式實(shí)例:
實(shí)例1:
\d{3}\s+\d{3,8}
\d{3} 表示匹配3個(gè)數(shù)字 ?例如010
\s 匹配一個(gè)空格或tab鸥诽,\s+表示至少有一個(gè)空格 例如 ‘ ’
\d{3商玫,8} 表示3-8個(gè)數(shù)字,例如‘1234567’
實(shí)例2:
‘0574-65972291’
\d{4}\-\d{4,8}
\w
正則表達(dá)式進(jìn)階:
要做更精確地匹配牡借,可以用 [ ] 表示范圍
A|B 可以匹配A或B拳昌,所以(P|p)ython可以匹配'Python'或者'python'
^表示行的開(kāi)頭,^\d表示必須以數(shù)字開(kāi)頭钠龙,$表示行的結(jié)束炬藤,\d$表示必須以數(shù)字結(jié)束。
re模塊
Python提供re模塊碴里,包含所有正則表達(dá)式的功能沈矿。由于Python的字符串本身也用 \ 轉(zhuǎn)義,因此使用Python的r前綴咬腋,就不用考慮轉(zhuǎn)義的問(wèn)題了羹膳。
例如: s = r ' ABC\-001 '
案例:
match( )方法?判斷是否匹配,如果匹配成功根竿,返回Match對(duì)象陵像,否則返回None。
正則切分字符串
用正則表達(dá)式切分字符串比用固定的字符更靈活寇壳,請(qǐng)看正常的切分代碼
>>> 'a b ?c'.split(' ')
['a', 'b', '', '', 'c']
>>>re.split(r'\s+','a b? c')
['a','b','c']
如果用戶輸入了一組標(biāo)簽蠢壹,下次記得用正則表達(dá)式來(lái)把不規(guī)范的輸入轉(zhuǎn)化成正確的數(shù)組。
分組
除了簡(jiǎn)單地判斷是否匹配之外九巡,正則表達(dá)式還有提取子串的強(qiáng)大功能图贸。用 ( ) 表示的就是要提取的分組(Group)
貪婪匹配
正則匹配默認(rèn)是貪婪匹配,也就是匹配盡可能多的字符冕广。
由于\d+采用貪婪匹配疏日,直接把后面的0全部匹配了,結(jié)果0*只能匹配空字符串了撒汉。
必須讓\d+采用非貪婪匹配(也就是盡可能少匹配)沟优,才能把后面的0匹配出來(lái),加個(gè)?就可以讓\d+采用非貪婪匹配:
編譯
當(dāng)我們?cè)赑ython中使用正則表達(dá)式時(shí)睬辐,re模塊內(nèi)部會(huì)干兩件事情:
1. 編譯正則表達(dá)式挠阁,如果正則表達(dá)式的字符串本身不合法,會(huì)報(bào)錯(cuò)溯饵;
2. 用編譯后的正則表達(dá)式去匹配字符串侵俗。
如果一個(gè)正則表達(dá)式要重復(fù)使用幾千次,出于效率的考慮丰刊,我們可以預(yù)編譯該正則表達(dá)式隘谣,接下來(lái)重復(fù)使用時(shí)就不需要編譯這個(gè)步驟了,直接匹配:
編譯后生成Regular Expression對(duì)象啄巧,由于該對(duì)象自己包含了正則表達(dá)式寻歧,所以調(diào)用對(duì)應(yīng)的方法時(shí)不用給出正則字符串掌栅。
筆記摘自:廖雪峰官網(wǎng):www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143193331387014ccd1040c814dee8b2164bb4f064cff000#0