正則表達式與Python
在了解了正則表達式的相關知識之後,開始查看Python當前如何通過使用re模塊來支持正則表達式,re模塊在很早之前就引入了,用於替換那些已過時的regex模塊和regsub模塊——這兩個模塊在Python2.5版中移除,而且此後導入這兩個模塊中的任意一個都會出發ImportError異常。
re模塊支持更強大而且更通用的Perl風格的正則表達式,該模塊允許多個線程共享同一個已經編譯的正則表達式對象,也支持命名子組。
使用compile( )函數編譯正則表達式
後面我們將要介紹的幾乎所有的re模塊函數都可以作為regex對象的方法。注意,儘管推薦預編譯,但這並不是必須的。如果需要編譯,就使用編譯過的方法:如果不需要編譯,就使用函數。幸運的是,不管使用函數還是方法,它們的名字都是相同的。
對於一些特別的正則表達式編譯,可選的標記可能以參數的形式給出,這些標記允許不區分大小寫的匹配,使用系統的本地化設置來匹配字母數字,等等。
這些標記也可以作為參數適用於大多數re模塊函數。如果想要在方法中使用這些標記,它們必須已經集成到已編譯的正則表達式對象之中,或者需要使用直接嵌入到正則比啊倒是本身的(?F)標記,其中F是一個或者多個i(用於re.I/IGNORECASE)、m(用於re.M/MULTILINE)、s(用於re.S/DOTALL)等。如果想要使用多個,就把它們放在一起而不是使用按位或操作,例如,(?im)可以用於同時表示re.IGNORECASE和re.MULTILINE。
匹配對象以及group( )和groups( )方法
當處理正則表達式時,除了正則表達式對象之外,還有另一個對象類型:匹配對象。這些是成功調用match( )或者search( )返回的對象。匹配對象有兩個主要的方法:group( )和groups( )。
group( )要麼返回整個匹配對象,要麼根據要求返回特定子組。groups( )則僅返回一個包含唯一或者全部子組的元組。如果沒有子組的要求,那麼當group( )仍然返回整個匹配時,groups( )返回一個空元組。
使用match( )方法匹配字符串
match( )方法是將要介紹的第一個re模塊函數和正則表達式對象方法。match( )函數試圖從字符串的起始部分對模式進行匹配。如果匹配成功,就返回一個匹配對象;如果匹配失敗,就返回None,匹配對象的group( )方法能夠用於顯示那個成功的匹配。下面是如何運用match( )方法以及group( )方法的一個實例:
模式「foo」完全匹配字符串「foo」,我們也能夠確認m是交互式解釋器中匹配對象的示例。
我們再來看一個失敗的匹配示例,它返回None:
因為上面的匹配失敗,所以m被賦值為None,而且以此方法構建的if沒有指明任何操作。對於剩餘的示例,如果可以,為了簡單起見,將省去if語句塊,但在實際操作中,最好不要省去以避免AttributeError異常(None是返回的錯誤值,該值並沒有group( )屬性[方法])。
只要模式從字符串的起始部分開始匹配,即使字符串比模式長,匹配也可以成功。例如,模式"foo"將在字符串"food on the table"中找到一個匹配,因為它是從字符串的起始部分進行匹配的。
可以看到,儘管字符串比模式要長,但從字符串的起始部分開始匹配依然會正確。子串"foo"是從那個較長的字符串中抽取出來的匹配部分。