1. 程式人生 > >正則表示式的基本語法和在Python下的使用

正則表示式的基本語法和在Python下的使用

正則表示式基本語法

常用正則表示式符號

符號 說明 舉例
literal 匹配字串的值 Foo
re1|re2 匹配正則表示式re1或re2 foo
. 匹配任何字元(換行符除外) b.b
^ 匹配字串的開始 ^bear
$ 匹配字串的結尾 /bin/*sh$
* 匹配前面出現的正則表示式零次或是多次([0, +∞)) [A-Za-z0-9]*
+ 匹配前面出現的正則表示式一次或是多次([1, +∞)) [a-z]+.com
? 匹配前面出現的正則表示式零次或是一次(0, 1) Goo?
{N} 匹配前面出現的正則表示式N次 [0-9]{3}
{M, N} 匹配重複出現M次到N次的正則表示式 [0-9]{5, 9}
[…] 匹配字元組裡面出現的任意一個字元 [aeiou]
[..x-y..] 匹配從字元x到y中的任意一個字元 [0-9], [A-Za-z]
[^…] 不匹配此字符集中出現的任何一個字元,包括某一範圍的字元(如果在此字符集中出現) [^aeiou], [^A-Za-z0-9]
(*|+|?|{})? 英語上面出現的任何“非貪婪”版本重複匹配次數符號(*,+,?,{}) .*?[a-z]
(…) 匹配封閉括號中正則表示式(RE),儲存為子組 ([0-9]{3})?, f(oo

特殊符號

符號 說明 舉例
\d 匹配任何數字,和[0-9]一樣(\D是\d的反義:任何非數字字元) Data\d+.txt
\w 匹配任何數字字母字元,和[a-zA-Z0-9]相同(\W是\w的反義) [A-Z][a-z]\w+
\s 匹配任何空白符,和[\n\t\r\v\f]相同,(\S是\s的反義) Of\sthe
\b 匹配單詞邊界(\B是\b的反義) \bThe\b
\nn 匹配已儲存的子組(可以參考正則表示式:(…)) Price:\16
\c 逐一匹配特殊字元c(即,取消它的特殊含義,按照字面匹配) ., \, *
\A (\Z) 匹配字串的起始(結束) \ADear

正則表示式在Python下的使用

Python下常用的正則表示式函式

函式/方法 描述
re模組的函式compile(pattern,flags=0) 對正則表示式模式pattern進行編譯,flags是可選標誌符,並返回一個regex物件
re模組的函式和regex物件的方法match(pattern, string, flags=0) 嘗試用正則表示式模式pattern匹配字串string,flags是可選標誌符,如果匹配成功,則返回一個匹配物件;否則返回None
search(pattern, string, flags=0) 在字串string中查詢正則表示式模式pattern的第一次出現,flags是可選標誌符,如果匹配成功,則返回一個匹配物件;否則返回None

Python中compile函式

compile函式主要是為了來提升效能的,那麼RE 編譯(何時應該使用compile函式?),下面是具體的原因:
Python 的程式碼最終會被編譯為位元組碼,然後才被直譯器執行。Python中的eval()或exec()呼叫一個程式碼物件而不是一個字串,在效能上會有明顯地提升,這是因為 編譯過程不必執行。換句話說,使用預編譯程式碼物件要比使用字串快,因為直譯器在執行字串形式的程式碼前必須先把它編譯成程式碼物件。
這個概念也適用於正則表示式, 在模式匹配之前, 正則表示式模式必須先被編譯成 regex 物件。由於正則表示式在執行過程中被多次用於比較,我們強烈建議先對它做預編譯,而且,既然正則表示式的編譯是必須的,那使用麼預先編譯來提升執行效能無疑是明智之舉。re.compile() 就是用來提供此功能的。
其實模組函式會對已編譯物件進行快取,所以不是所有使用相同正則表示式模式的 search()和match()都需要編譯。即使這樣,你仍然節省了查詢快取,和用相同的字串反覆呼叫函式的效能開銷。 在 Python1.5.2 版本里, 快取區可以容納 20 個已編譯的正則表示式物件,而在 1.6 版本里,由於另外添加了對 Unicode 的支援,編譯引擎的速度變慢了一些,所以快取區被擴充套件到可以容納 100個已編譯的 regex 物件。