| 導航:起始頁 > Dive Into Python > 正則表達式 > 個案研究:羅馬字母 | << >> | ||||
深入 Python :Dive Into Python 中文版Python 從新手到專家 [Dip_5.4b_CPyUG_Release] |
|||||
你可能經常看到羅馬數字,即使你沒有意識到它們。你可能曾經在老電影或者電視中看到它們 (“版權所有 MCMXLVI” 而不是 “版權所有1946”),或者在某圖書館或某大學的貢獻墻上看到它們 (“成立于 MDCCCLXXXVIII”而不是“成立于1888”)。你也可能在某些文獻的大綱或者目錄上看到它們。這是一個表示數字的系統,它實際上能夠追溯到遠古的羅馬帝國 (因此而得名)。
在羅馬數字中,利用7個不同字母進行重復或者組合來表達各式各樣的數字。
下面是關于構造羅馬數字的一些通用的規則的介紹:
怎樣校驗任意一個字符串是否為一個有效的羅馬數字呢?我們每次只看一位數字,由于羅馬數字一般是從高位到低位書寫。我們從高位開始:千位。對于大于或等于 1000 的數字,千位由一系列的字符 M 表示。
>>> import re >>> pattern = '^M?M?M?$'>>> re.search(pattern, 'M')
<SRE_Match object at 0106FB58> >>> re.search(pattern, 'MM')
<SRE_Match object at 0106C290> >>> re.search(pattern, 'MMM')
<SRE_Match object at 0106AA38> >>> re.search(pattern, 'MMMM')
>>> re.search(pattern, '')
<SRE_Match object at 0106F4A8>
與千位數相比,百位數識別起來要困難得多,這是因為有多種相互獨立的表達方式都可以表達百位數,而具體用那種方式表達和具體的數值有關。
因此有四種可能的模式:
后面兩個模式可以結合到一起:
這個例子顯示如何有效地識別羅馬數字的百位數。
>>> import re >>> pattern = '^M?M?M?(CM|CD|D?C?C?C?)$'>>> re.search(pattern, 'MCM')
<SRE_Match object at 01070390> >>> re.search(pattern, 'MD')
<SRE_Match object at 01073A50> >>> re.search(pattern, 'MMMCCC')
<SRE_Match object at 010748A8> >>> re.search(pattern, 'MCMC')
>>> re.search(pattern, '')
<SRE_Match object at 01071D98>
哎呀!看看正則表達式能夠多快變得難以理解?你僅僅表示了羅馬數字的千位和百位上的數字。如果你根據類似的方法,十位數和各位數就非常簡單了,因為是完全相同的模式。讓我們來看表達這個模式的另一種方式吧。
<< 個案研究:街道地址 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
使用 {n,m} 語法 >> |