| 導航:起始頁 > Dive Into Python > 正則表達式 > 使用 {n,m} 語法 | << >> | ||||
深入 Python :Dive Into Python 中文版Python 從新手到專家 [Dip_5.4b_CPyUG_Release] |
|||||
在前面的章節,你處理了相同字符可以重復三次的情況。在正則表達式中,有另外一個方式來表達這種情況,并且能提高代碼的可讀性。首先看看我們在前面的例子中使用的方法。
>>> import re >>> pattern = '^M?M?M?$' >>> re.search(pattern, 'M')<_sre.SRE_Match object at 0x008EE090> >>> pattern = '^M?M?M?$' >>> re.search(pattern, 'MM')
<_sre.SRE_Match object at 0x008EEB48> >>> pattern = '^M?M?M?$' >>> re.search(pattern, 'MMM')
<_sre.SRE_Match object at 0x008EE090> >>> re.search(pattern, 'MMMM')
>>>
>>> pattern = '^M{0,3}$'>>> re.search(pattern, 'M')
<_sre.SRE_Match object at 0x008EEB48> >>> re.search(pattern, 'MM')
<_sre.SRE_Match object at 0x008EE090> >>> re.search(pattern, 'MMM')
<_sre.SRE_Match object at 0x008EEDA8> >>> re.search(pattern, 'MMMM')
>>>
| 沒有一個輕松的方法來確定兩個正則表達式是否等價。你能采用的最好的辦法就是列出很多的測試樣例,確定這兩個正則表達式對所有的相關輸入都有相同的輸出。在本書后面的章節,將更多地討論如何編寫測試樣例。 | |
現在我們來擴展一下關于羅馬數字的正則表達式,以匹配十位數和個位數,下面的例子展示十位數的校驗方法。
>>> pattern = '^M?M?M?(CM|CD|D?C?C?C?)(XC|XL|L?X?X?X?)$' >>> re.search(pattern, 'MCMXL')<_sre.SRE_Match object at 0x008EEB48> >>> re.search(pattern, 'MCML')
<_sre.SRE_Match object at 0x008EEB48> >>> re.search(pattern, 'MCMLX')
<_sre.SRE_Match object at 0x008EEB48> >>> re.search(pattern, 'MCMLXXX')
<_sre.SRE_Match object at 0x008EEB48> >>> re.search(pattern, 'MCMLXXXX')
>>>
對于個位數的正則表達式有類似的表達方式,我將省略細節,直接展示結果。
>>> pattern = '^M?M?M?(CM|CD|D?C?C?C?)(XC|XL|L?X?X?X?)(IX|IV|V?I?I?I?)$'
用另一種 {n,m} 語法表達這個正則表達式會如何呢?這個例子展示新的語法。
>>> pattern = '^M{0,3}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$' >>> re.search(pattern, 'MDLV')<_sre.SRE_Match object at 0x008EEB48> >>> re.search(pattern, 'MMDCLXVI')
<_sre.SRE_Match object at 0x008EEB48> >>> re.search(pattern, 'MMMDCCCLXXXVIII')
<_sre.SRE_Match object at 0x008EEB48> >>> re.search(pattern, 'I')
<_sre.SRE_Match object at 0x008EEB48>
如果你在第一遍就跟上并理解了所講的這些,那么你做的比我還要好。現在,你可以嘗試著理解別人大規模程序里關鍵函數中的正則表達式了。或者想象著幾個月后回頭理解你自己的正則表達式。我曾經做過這樣的事情,但是它并不是那么有趣。
在下一節里,你將會研究另外一種正則表達式語法,它可以使你的表達式具有更好的可維持性。
<< 個案研究:羅馬字母 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
松散正則表達式 >> |