python 自1.5版本起增加了re 模組,它提供 perl 風格的正規表示式模式。python 1.5之前版本則是通過 regex 模組提供 emecs 風格的模式。emacs 風格模式可讀性稍差些,而且功能也不強,因此編寫新**時盡量不要再使用 regex 模組,當然偶爾你還是可能在老**裡發現其蹤影。
就其本質而言,正規表示式(或 re)是一種小型的、高度專業化的程式語言,(在python中)它內嵌在python中,並通過 re 模組實現。使用這個小型語言,你可以為想要匹配的相應字串集指定規則;該字串集可能包含英文語句、e-mail位址、tex命令或任何你想搞定的東西。然後你可以問諸如「這個字串匹配該模式嗎?」或「在這個字串中是否有部分匹配該模式呢?」。你也可以使用 re 以各種方式來修改或分割字串。
正規表示式模式被編譯成一系列的位元組碼,然後由用 c 編寫的匹配引擎執行。在高階用法中,也許還要仔細留意引擎是如何執行給定 re ,如何以特定方式編寫 re 以令生產的位元組碼執行速度更快。本文並不涉及優化,因為那要求你已充分掌握了匹配引擎的內部機制。
正規表示式語言相對小型和受限(功能有限),因此並非所有字串處理都能用正規表示式完成。當然也有些任務可以用正規表示式完成,不過最終表示式會變得異常複雜。碰到這些情形時,編寫 python **進行處理可能反而更好;儘管 python **比乙個精巧的正規表示式要慢些,但它更易理解。
我們將從最簡單的正規表示式學習開始。由於正規表示式常用於字串操作,那我們就從最常見的任務:字元匹配 下手。
有關正規表示式底層的電腦科學上的詳細解釋(確定性和非確定性有限自動機),你可以查閱編寫編譯器相關的任何教科書。
字元匹配
大多數字母和字元一般都會和自身匹配。例如,正規表示式 test 會和字串「test」完全匹配。(你也可以使用大小寫不敏感模式,它還能讓這個 re 匹配「test」或「test」;稍後會有更多解釋。)
這個規則當然會有例外;有些字元比較特殊,它們和自身並不匹配,而是會表明應和一些特殊的東西匹配,或者它們會影響到 re 其它部分的重複次數。本文很大篇幅專門討論了各種元字元及其作用。
這裡有乙個元字元的完整列表;其含義會在本指南餘下部分進行討論。
. ^ $ * + ? { [ ]
\| ( )
我們首先考察的元字元是"[" 和 "]"。它們常用來指定乙個字元類別,所謂字元類別就是你想匹配的乙個字符集。字元可以單個列出,也可以用「-」號分隔的兩個給定字元來表示乙個字元區間。例如,[abc] 將匹配"a", "b", 或 "c"中的任意乙個字元;也可以用區間[a-c]來表示同一字符集,和前者效果一致。如果你只想匹配小寫字母,那么 re 應寫成 [a-z].
元字元在類別裡並不起作用。例如,[akm$]將匹配字元"a", "k", "m", 或 "$" 中的任意乙個;"$"通常用作元字元,但在字元類別裡,其特性被除去,恢復成普通字元。
你可以用補集來匹配不在區間範圍內的字元。其做法是把"^"作為類別的首個字元;其它地方的"^"只會簡單匹配 "^"字元本身。例如,[^5] 將匹配除 "5" 之外的任意字元。
也許最重要的元字元是反斜槓"""。 做為 python 中的字串字母,反斜槓後面可以加不同的字元以表示不同特殊意義。它也可以用於取消所有的元字元,這樣你就可以在模式中匹配它們了。舉個例子,如果你需要匹配字元 "[" 或 """,你可以在它們之前用反斜槓來取消它們的特殊意義: "[ 或 ""。
一些用 """ 開始的特殊字元所表示的預定義字符集通常是很有用的,象數字集,字母集,或其它非空字符集。下列是可用的預設特殊字元:
正規表示式詳細介紹
單個表示 1 d 數字 2 d 非數字 注 大小寫就是取反的意思 3 w 任意乙個字母或數字或下劃線 4 s 空白符 換行 製表符 空格 5 任意字元 除了換行符 自定義字元集合 表示匹配內的任意乙個字元,是乙個或運算,比如 123 就表示是數字1或數字2或數字3 表示非運算,比如 123 表示除了...
正規表示式詳細講解
什麼是正規表示式?正規表示式通常被用來檢索 替換那些符合某個規則的文字,使用一系列特殊字元模式,來表示某一類字串。元字元 元字元含義 將下乙個字元標記符 或乙個向後引用 或乙個八進位制轉義符 匹配輸入字行首 匹配輸入行尾 匹配前面的子表示式任意次 匹配前面的子表示式一次或多次 大於等於1次 匹配前面...
詳細講解 正規表示式
正規表示式,又稱規則表示式。英語 regular expression,在 中常簡寫為regex regexp或re 電腦科學的乙個概念。正規表示式通常被用來檢索 替換那些符合某個模式 規則 的文字。許多程式語言都支援利用正規表示式進行字串操作。例如,在perl中就內建了乙個功能強大的正規表示式引擎...