初識 Python 正規(guī)表示式
正規(guī)表示式是一個(gè)特殊的字元序列,用來判斷一個(gè)字串是否與我們所設(shè)定的字元序列是否匹配,也就是說檢查一個(gè)字串是否與某種模式匹配。
Python 自 1.5 版本起增加了re 模組,它提供 Perl 風(fēng)格的正規(guī)表示式模式。 re 模組讓 Python 語言擁有全部的正規(guī)表示式功能。
下面透過實(shí)例,一步一步來初步認(rèn)識正規(guī)表示式。
例如在一段字串中尋找是否含有某個(gè)字符或某些字符,通常我們使用內(nèi)建函數(shù)來實(shí)現(xiàn),如下:
# 設(shè)定一個(gè)常量 a = '兩點(diǎn)水|twowater|liangdianshui|草根程序員|ReadingWithU' # 判斷是否有 “兩點(diǎn)水” 這個(gè)字符串,使用 PY 自帶函數(shù) print('是否含有“兩點(diǎn)水”這個(gè)字符串:{0}'.format(a.index('兩點(diǎn)水') > -1)) print('是否含有“兩點(diǎn)水”這個(gè)字符串:{0}'.format('兩點(diǎn)水' in a))
輸出的結(jié)果如下:
是否含有“兩點(diǎn)水”這個(gè)字符串:True 是否含有“兩點(diǎn)水”這個(gè)字符串:True
那麼,如果使用正規(guī)表示式呢?
剛剛提到過,Python 給我們提供了re 模組來實(shí)現(xiàn)正則表達(dá)式的所有功能,那麼我們先使用其中的一個(gè)函數(shù):
re.findall(pattern, string[, flags])
該函數(shù)實(shí)現(xiàn)了在字串中找到正規(guī)表示式所匹配的所有子字串,並組成一個(gè)列表返回,具體操作如下:
import re # 設(shè)定一個(gè)常量 a = '兩點(diǎn)水|twowater|liangdianshui|草根程序員|ReadingWithU' # 正則表達(dá)式 findall = re.findall('兩點(diǎn)水', a) print(findall) if len(findall) > 0: print('a 含有“兩點(diǎn)水”這個(gè)字符串') else: print('a 不含有“兩點(diǎn)水”這個(gè)字符串')
輸出的結(jié)果:
['兩點(diǎn)水'] a 含有“兩點(diǎn)水”這個(gè)字符串
從輸出結(jié)果可以看到,可以實(shí)現(xiàn)和內(nèi)建函數(shù)一樣的功能,可是在這裡也要強(qiáng)調(diào)一點(diǎn),上面這個(gè)例子只是方便我們理解正規(guī)表示式,這個(gè)正規(guī)表示式的寫法是毫無意義的。為什麼要這樣說呢?
因?yàn)橛?Python 自帶函數(shù)就能解決的問題,我們就沒必要使用正規(guī)表示式了,而且這樣做多此一舉。而且上面例子中的正規(guī)表示式設(shè)定成為了一個(gè)常數(shù),並不是一個(gè)正規(guī)表示式的規(guī)則,而正規(guī)表示式的靈魂在於規(guī)則,所以這樣做意義不大。
那麼正規(guī)表示式的規(guī)則怎麼寫呢?先不急,我們一步一步來,先來一個(gè)簡單的,找出字串中的所有小寫字母。首先我們在 findall 函數(shù)中第一個(gè)參數(shù)寫正規(guī)表示式的規(guī)則,其中 [a-z] 就是要符合任何小寫字母,第二個(gè)參數(shù)只要填入要符合的字串就行了。具體如下:
import re # 設(shè)定一個(gè)常量 a = '兩點(diǎn)水|twowater|liangdianshui|草根程序員|ReadingWithU' # 選擇 a 里面的所有小寫英文字母 re_findall = re.findall('[a-z]', a) print(re_findall)
輸出的結(jié)果:
['t', 'w', 'o', 'w', 'a', 't', 'e', 'r', 'l', 'i', 'a', 'n', 'g', 'd', 'i', 'a', 'n', 's', 'h', 'u', 'i', 'e', 'a', 'd', 'i', 'n', 'g', 'i', 't', 'h']
這樣我們就拿到了字串中的所有小寫字母了。