天天看點

Python正規表達式指南上半部

本文介紹了Python對于正規表達式的支援,包括正規表達式基礎以及Python正規表達式标準庫的完整介紹及使用示例。本文的内容不包括如何編寫高效的正規表達式、如何優化正規表達式,這些主題請檢視其他教程。

  注意:本文基于Python2.4完成;如果看到不明白的詞彙請記得百度谷歌或維基,whatever。

  正規表達式并不是Python的一部分。正規表達式是用于處理字元串的強大工具,擁有自己獨特的文法以及一個獨立的處理引擎,效率上可能不如str自帶的方法,但功能十分強大。得益于這一點,在提供了正規表達式的語言裡,正規表達式的文法都是一樣的,差別隻在于不同的程式設計語言實作支援的文法數量不同;但不用擔心,不被支援的文法通常是不常用的部分。如果已經在其他語言裡使用過正規表達式,隻需要簡單看一看就可以上手了。

下圖展示了使用正規表達式進行比對的流程:

  正規表達式的大緻比對過程是:依次拿出表達式和文本中的字元比較,如果每一個字元都能比對,則比對成功;一旦有比對不成功的字元則比對失敗。如果表達式中有量詞或邊界,這個過程會稍微有一些不同,但也是很好了解的,看下圖中的示例以及自己多使用幾次就能明白。

下圖列出了Python支援的正規表達式元字元和文法:

  正規表達式通常用于在文本中查找比對的字元串。Python裡數量詞預設是貪婪的(在少數語言裡也可能是預設非貪婪),總是嘗試比對盡可能多的字元;非貪婪的則相反,總是嘗試比對盡可能少的字元。例如:正規表達式”ab*”如果用于查找”abbbc”,将找到”abbb”。而如果使用非貪婪的數量詞”ab*?”,将找到”a”。

  與大多數程式設計語言相同,正規表達式裡使用”\”作為轉義字元,這就可能造成反斜杠困擾。假如你需要比對文本中的字元”\”,那麼使用程式設計語言表示的正規表達式裡将需要4個反斜杠”\\\\”:前兩個和後兩個分别用于在程式設計語言裡轉義成反斜杠,轉換成兩個反斜杠後再在正規表達式裡轉義成一個反斜杠。Python裡的原生字元串很好地解決了這個問題,這個例子中的正規表達式可以使用r”\\”表示。同樣,比對一個數字的”\\d”可以寫成r”\d”。有了原生字元串,你再也不用擔心是不是漏寫了反斜杠,寫出來的表達式也更直覺。

  正規表達式提供了一些可用的比對模式,比如忽略大小寫、多行比對等,這部分内容将在Pattern類的工廠方法re.compile(pattern[, flags])中一起介紹。

  Python通過re子產品提供對正規表達式的支援。使用re的一般步驟是先将正規表達式的字元串形式編譯為Pattern執行個體,然後使用Pattern執行個體處理文本并獲得比對結果(一個Match執行個體),最後使用Match執行個體獲得資訊,進行其他的操作。

<code># encoding: UTF-8</code>

<code>import</code> <code>re</code>

<code># 将正規表達式編譯成Pattern對象</code>

<code>pattern</code><code>=</code> <code>re.</code><code>compile</code><code>(r</code><code>'hello'</code><code>)</code>

<code># 使用Pattern比對文本,獲得比對結果,無法比對時将傳回None</code>

<code>match</code><code>=</code> <code>pattern.match(</code><code>'hello world!'</code><code>)</code>

<code>if</code> <code>match:</code>

<code>    </code><code># 使用Match獲得分組資訊</code>

<code>    </code><code>print</code> <code>match.group()</code>

<code>### 輸出 ###</code>

<code># hello</code>

  re.compile(strPattern[, flag]):

  這個方法是Pattern類的工廠方法,用于将字元串形式的正規表達式編譯為Pattern對象。 第二個參數flag是比對模式,取值可以使用按位或運算符’|'表示同時生效,比如re.I | re.M。另外,你也可以在regex字元串中指定模式,比如re.compile(‘pattern’, re.I | re.M)與re.compile(‘(?im)pattern’)是等價的。

  可選值有:

re.I(re.IGNORECASE): 忽略大小寫(括号内是完整寫法,下同)

M(MULTILINE): 多行模式,改變’^'和’$'的行為(參見上圖)

S(DOTALL): 點任意比對模式,改變’.'的行為

L(LOCALE): 使預定字元類 \w \W \b \B \s \S 取決于目前區域設定

U(UNICODE): 使預定字元類 \w \W \b \B \s \S \d \D 取決于unicode定義的字元屬性

X(VERBOSE): 詳細模式。這個模式下正規表達式可以是多行,忽略空白字元,并可以加入注釋。以下兩個正規表達式是等價的:

<code>a</code><code>=</code> <code>re.</code><code>compile</code><code>(r</code><code>"""\d +  # the integral part</code>

<code>                   </code><code>\.    # the decimal point</code>

<code>                   </code><code>\d *  # some fractional digits"""</code><code>, re.X)</code>

<code>b</code><code>=</code> <code>re.</code><code>compile</code><code>(r</code><code>"\d+\.\d*"</code><code>)</code>

<code></code>

本文轉自    風雨蕭條 部落格,原文連結:    http://blog.51cto.com/1095221645/1607789    如需轉載請自行聯系原作者