第二篇詳細Python正則表達式操作指南(re使用)
06-26
第二篇詳細Python正則表達式操作指南(re使用)
如果沒有匹配到的話,match() 和 search() 將返回 None。如果成功的話,就會返回一個 `MatchObject` 實例,其中有這次匹配的信息:它是從哪裡開始和結束,它所匹配的子串等等。你可以用採用人機對話並用 re 模塊實驗的方式來學習它。如果你有 Tkinter 的話,你也許可以考慮參考一下 Tools/scripts/redemo.py,一個包含在 Python 發行版里的示範程序。首先,運行 Python 解釋器,導入 re 模塊並編譯一個 RE: 現在,你可以試著用 RE 的 [a-z]+ 去匹配不同的字元串。一個空字元串將根本不能匹配,因為 + 的意思是 「一個或更多的重複次數」。 在這種情況下 match() 將返回 None,因為它使解釋器沒有輸出。你可以明確地列印出 match() 的結果來弄清這一點。
現在,讓我們試著用它來匹配一個字元串,如 "tempo"。這時,match() 將返回一個 MatchObject。因此你可以將結果保存在變數里以便後面使用。現在你可以查詢 `MatchObject` 關於匹配字元串的相關信息了。MatchObject 實例也有幾個方法和屬性;最重要的那些如下所示:試試這些方法不久就會清楚它們的作用了:
group() 返回 RE 匹配的子串。start() 和 end() 返回匹配開始和結束時的索引。span() 則用單個元組把開始和結束時的索引一起返回。因為匹配方法檢查到如果 RE 在字元串開始處開始匹配,那麼 start() 將總是為零。然而, `RegexObject` 實例的 search 方法掃描下面的字元串的話,在這種情況下,匹配開始的位置就也許不是零了。在實際程序中,最常見的作法是將 `MatchObject` 保存在一個變數里,然後檢查它是否為 None,通常如下所示:
在上面的例子里,Python 的字元串自動連接可以用來將 RE 分成更小的部分,但它比用 re.VERBOSE 標誌時更難懂。更多模式功能到目前為止,我們只展示了正則表達式的一部分功能。在本節,我們將展示一些新的元字元和如何使用組來檢索被匹配的文本部分。更多的元字元還有一些我們還沒展示的元字元,其中的大部分將在下一章節展示。
推薦閱讀:
來自專欄 Python大神進階之路
接下來昨天的內容
執行匹配一旦你有了已經編譯了的正則表達式的對象,你要用它做什麼呢?`RegexObject` 實例有一些方法和屬性。這裡只顯示了最重要的幾個,如果要看完整的列表請查閱 Python Library Referencefindall() 在它返回結果時不得不創建一個列表。在 Python 2.2中,也可以用 finditer() 方法。
模塊級函數你不一定要產生一個 `RegexObject` 對象然後再調用它的方法;re 模塊也提供了頂級函數調用如 match()、search()、sub() 等等。這些函數使用 RE 字元串作為第一個參數,而後面的參數則與相應 `RegexObject` 的方法參數相同,返回則要麼是 None 要麼就是一個 `MatchObject` 的實例。Under the hood, 這些函數簡單地產生一個 RegexOject 並在其上調用相應的方法。它們也在緩存里保存編譯後的對象,因此在將來調用用到相同 RE 時就會更快。
你將使用這些模塊級函數,還是先得到一個 `RegexObject` 再調用它的方法呢?如何選擇依賴於怎樣用 RE 更有效率以及你個人編碼風格。如果一個 RE 在代碼中只做用一次的話,那麼模塊級函數也許更方便。如果程序包含很多的正則表達式,或在多處復用同一個的話,那麼將全部定義放在一起,在一段代碼中提前編譯所有的 REs 更有用。從標準庫中看一個例子,這是從 xmllib.py 文件中提取出來的: 我通常更喜歡使用編譯對象,甚至它只用一次,but few people will be as much of a purist about this as I am。編譯標誌編譯標誌讓你可以修改正則表達式的一些運行方式。在 re 模塊中標誌可以使用兩個名字,一個是全名如 IGNORECASE,一個是縮寫,一字母形式如 I。(如果你熟悉 Perl的模式修改,一字母形式使用同樣的字母;例如 re.VERBOSE的縮寫形式是 re.X。)多個標誌可以通過按位 OR-ing 它們來指定。如
re.I | re.M 被設置成 I 和 M 標誌:這有個可用標誌表,對每個標誌後面都有詳細的說明。 IGNORECASE 使匹配對大小寫不敏感;字元類和字元串匹配字母時忽略大小寫。舉個例子,[A-Z]也可以匹配小寫字母,Spam 可以匹配 "Spam", "spam", 或 "spAM"。這個小寫字母並不考慮當前位置。LLOCALE 影響 "w, "W, "b, 和 "B,這取決於當前的本地化設置。locales
是 C 語言庫中的一項功能,是用來為需要考慮不同語言的編程提供幫助的。舉個例子,如果你正在處理法文文本,你想用 "w+ 來匹配文字,但 "w 只匹配字元類 [A-Za-z];它並不能匹配 "é" 或 "?"。如果你的系統配置適當且本地化設置為法語,那麼內部的 C 函數將告訴程序 "é" 也應該被認為是一個字母。當在編譯正則表達式時使用 LOCALE 標誌會得到用這些 C 函數來處理 "w 後的編譯對象;這會更慢,但也會象你希望的那樣可以用 "w+ 來匹配法文文本。MMULTILINE (此時 ^ 和 $ 不會被解釋; 它們將在 4.1 節被介紹.)使用 "^" 只匹配字元串的開始,而 $ 則只匹配字元串的結尾和直接在換行前(如果有的話)的字元串結尾。當本標誌指定後, "^" 匹配字元串的開始和字元串中每行的開始。同樣的, $ 元字元匹配字元串結尾和字元串中每行的結尾(直接在每個換行之前)。SDOTALL
使 "." 特殊字元完全匹配任何字元,包括換行;沒有這個標誌, "." 匹配除了換行外的任何字元。XVERBOSE 該標誌通過給予你更靈活的格式以便你將正則表達式寫得更易於理解。當該標誌被指定時,在 RE 字元串中的空白符被忽略,除非該空白符在字元類中或在反斜杠之後;這可以讓你更清晰地組織和縮進 RE。它也可以允許你將注釋寫入 RE,這些注釋會被引擎忽略;注釋用 "#"號 來標識,不過該符號不能在字元串或反斜杠之後。舉個例子,這裡有一個使用 re.VERBOSE 的 RE;看看讀它輕鬆了多少?推薦閱讀:
※世上最奇葩的6種編程語言,你知道幾種?
※乾貨 | 全面深入理解 Python 面向對象
※理論上最好的編程語言: 起點動機篇
※寫了那麼久代碼了,給大家談談我怎麼理解編程
※html5可以做什麼?HTML5市場需求有哪些?