Python正則表達(dá)式基本應(yīng)用方式解讀
Python編程語(yǔ)言是一種功能強(qiáng)大的面向?qū)ο蟮闹弊g式計(jì)算機(jī)程序語(yǔ)言。那么如何才能正確的應(yīng)用這一語(yǔ)言來(lái)幫助我們完成一些功能需求的實(shí)現(xiàn)呢?在這里我們就可以先從Python正則表達(dá)式的相關(guān)內(nèi)容開(kāi)始了解。#t#
Python 自1.5版本起增加了re 模塊,它提供 Perl 風(fēng)格的正則表達(dá)式模式。Python 1.5之前版本則是通過(guò) regex 模塊提供 Emecs 風(fēng)格的模式。Emacs 風(fēng)格模式可讀性稍差些,而且功能也不強(qiáng),因此編寫(xiě)新代碼時(shí)盡量不要再使用 regex 模塊,當(dāng)然偶爾你還是可能在老代碼里發(fā)現(xiàn)其蹤影。
就其本質(zhì)而言,Python正則表達(dá)式(或 RE)是一種小型的、高度專(zhuān)業(yè)化的編程語(yǔ)言,(在Python中)它內(nèi)嵌在Python中,并通過(guò) re 模塊實(shí)現(xiàn)。使用這個(gè)小型語(yǔ)言,你可以為想要匹配的相應(yīng)字符串集指定規(guī)則;該字符串集可能包含英文語(yǔ)句、e-mail地址、TeX命令或任何你想搞定的東 西。然後你可以問(wèn)諸如“這個(gè)字符串匹配該模式嗎?”或“在這個(gè)字符串中是否有部分匹配該模式呢?”。你也可以使用 RE 以各種方式來(lái)修改或分割字符串。
正則表達(dá)式模式被編譯成一系列的字節(jié)碼,然後由用 C 編寫(xiě)的匹配引擎執(zhí)行。在高級(jí)用法中,也許還要仔細(xì)留意引擎是如何執(zhí)行給定 RE ,如何以特定方式編寫(xiě) RE 以令生產(chǎn)的字節(jié)碼運(yùn)行速度更快。本文并不涉及優(yōu)化,因?yàn)槟且竽阋殉浞终莆樟似ヅ湟娴膬?nèi)部機(jī)制。
正則表達(dá)式語(yǔ)言相對(duì)小型和受限(功能有限),因此并非所有字符串處理都能用正則表達(dá)式完成。當(dāng)然也有些任務(wù)可以用正則表達(dá)式完成, 不過(guò)最終表達(dá)式會(huì)變得異常復(fù)雜。碰到這些情形時(shí),編寫(xiě) Python 代碼進(jìn)行處理可能反而更好;盡管 Python 代碼比一個(gè)精巧的正則表達(dá)式要慢些,但它更易理解。
簡(jiǎn)單模式
我們將從最簡(jiǎn)單的Python正則表達(dá)式學(xué)習(xí)開(kāi)始。由于正則表達(dá)式常用于字符串操作,那我們就從最常見(jiàn)的任務(wù):字符匹配 下手。
有關(guān)正則表達(dá)式底層的計(jì)算機(jī)科學(xué)上的詳細(xì)解釋?zhuān)ù_定性和非確定性有限自動(dòng)機(jī)),你可以查閱編寫(xiě)編譯器相關(guān)的任何教科書(shū)。
字符匹配
大多數(shù)字母和字符一般都會(huì)和自身匹配。例如,正則表達(dá)式 test 會(huì)和字符串“test”完全匹配。(你也可以使用大小寫(xiě)不敏感模式,它還能讓這個(gè) RE 匹配“Test”或“TEST”;稍後會(huì)有更多解釋。)
這個(gè)規(guī)則當(dāng)然會(huì)有例外;有些字符比較特殊,它們和自身并不匹配,而是會(huì)表明應(yīng)和一些特殊的東西匹配,或者它們會(huì)影響到 RE 其它部分的重復(fù)次數(shù)。本文很大篇幅專(zhuān)門(mén)討論了各種元字符及其作用。
重復(fù)
Python正則表達(dá)式第一件能做的事是能夠匹配不定長(zhǎng)的字符集,而這是其它能作用在字符串上的方法所不能做到的。 不過(guò),如果那是正則表達(dá)式唯一的附加功能的話(huà),那么它們也就不那么優(yōu)秀了。它們的另一個(gè)功能就是你可以指定正則表達(dá)式的一部分的重復(fù)次數(shù)。
我們討論的第一個(gè)重復(fù)功能的元字符是 *。* 并不匹配字母字符 "*";相反,它指定前一個(gè)字符可以被匹配零次或更多次,而不是只有一次。
舉個(gè)例子,ca*t 將匹配 "ct" (0 個(gè) "a" 字符), "cat" (1 個(gè) "a"), "caaat" (3 個(gè) "a" 字符)等等。RE 引擎有各種來(lái)自 C 的整數(shù)類(lèi)型大小的內(nèi)部限制,以防止它匹配超過(guò)2億個(gè) "a" 字符;你也許沒(méi)有足夠的內(nèi)存去建造那么大的字符串,所以將不會(huì)累計(jì)到那個(gè)限制。
象 * 這樣地重復(fù)是“貪婪的”;當(dāng)重復(fù)一個(gè) RE 時(shí),匹配引擎會(huì)試著重復(fù)盡可能多的次數(shù)。如果模式的後面部分沒(méi)有被匹配,匹配引擎將退回并再次嘗試更小的重復(fù)。