| 導航:起始頁 > Dive Into Python > 正則表達式 > 松散正則表達式 | << >> | ||||
深入 Python :Dive Into Python 中文版Python 從新手到專家 [Dip_5.4b_CPyUG_Release] |
|||||
迄今為止,你只是處理過被我稱之為“緊湊”類型的正則表達式。正如你曾看到的,它們難以閱讀,即使你清楚正則表達式的含義,你也不能保證六個月以后你還能理解它。你真正所需的就是利用內聯文檔 (inline documentation)。
Python 允許用戶利用所謂的松散正則表達式 來完成這個任務。一個松散正則表達式和一個緊湊正則表達式主要區別表現在兩個方面:
用一個例子可以解釋得更清楚。讓我們重新來看前面的緊湊正則表達式,利用松散正則表達式重新表達。下面的例子顯示實現方法。
>>> pattern = """ ^ # beginning of string M{0,3} # thousands - 0 to 3 M's (CM|CD|D?C{0,3}) # hundreds - 900 (CM), 400 (CD), 0-300 (0 to 3 C's), # or 500-800 (D, followed by 0 to 3 C's) (XC|XL|L?X{0,3}) # tens - 90 (XC), 40 (XL), 0-30 (0 to 3 X's), # or 50-80 (L, followed by 0 to 3 X's) (IX|IV|V?I{0,3}) # ones - 9 (IX), 4 (IV), 0-3 (0 to 3 I's), # or 5-8 (V, followed by 0 to 3 I's) $ # end of string """ >>> re.search(pattern, 'M', re.VERBOSE)<_sre.SRE_Match object at 0x008EEB48> >>> re.search(pattern, 'MCMLXXXIX', re.VERBOSE)
<_sre.SRE_Match object at 0x008EEB48> >>> re.search(pattern, 'MMMDCCCLXXXVIII', re.VERBOSE)
<_sre.SRE_Match object at 0x008EEB48> >>> re.search(pattern, 'M')
![]()
| 當使用松散正則表達式時,最重要的一件事情就是:必須傳遞一個額外的參數 re.VERBOSE,該參數是定義在 re 模塊中的一個常量,標志著待匹配的正則表達式是一個松散正則表達式。正如你看到的,這個模式中,有很多空格 (所有的空格都被忽略),和幾個注釋 (所有的注釋也被忽略)。如果忽略所有的空格和注釋,它就和前面章節里的正則表達式完全相同,但是具有更好的可讀性。 | |
| 這個模式匹配字符串的開始,接著匹配三個可選 M 字符中的一個,接著匹配 CM,接著是字符 L 和三個可選 X 字符的所有字符,接著是 IX,然后是字符串的結尾。 | |
| 這個模式匹配字符串的開始,接著是三個可選的 M 字符的所有字符,接著匹配 D?C{0,3},此處為一個字符 D 和三個可選 C 字符中所有字符,接著匹配 L?X{0,3},此處為一個 L 字符和三個可選 X 字符中所有字符,接著匹配 V?I{0,3},此處為一個字符 V 和三個可選 I 字符中所有字符,接著匹配字符串的結尾。 | |
| 這個沒有匹配。為什么呢?因為沒有 re.VERBOSE 標記,所以 re.search 函數把模式作為一個緊湊正則表達式進行匹配。Python 不能自動檢測一個正則表達式是為松散類型還是緊湊類型。Python 默認每一個正則表達式都是緊湊類型的,除非你顯式地標明一個正則表達式為松散類型。 |
<< 使用 {n,m} 語法 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
個案研究:解析電話號碼 >> |