您当前位置:首页 > 深入 Python > 正则表达式 > 案例研究:罗马数字 | << >> | ||||
深入 Python从 Python 新手到专家 |
您很可能见过罗马数字,即使您可能没有意识到。您可能在老电影和电视节目的版权声明中看到过它们(“版权所有 MCMXLVI”而不是“版权所有 1946”),或者在图书馆或大学的落成纪念墙上看到过它们(“建于 MDCCCLXXXVIII”而不是“建于 1888”)。您可能还在提纲和参考文献中看到过它们。这是一种表示数字的系统,它的历史可以追溯到古罗马帝国(因此得名)。
在罗马数字中,有七个字符以各种方式重复和组合来表示数字。
以下是构造罗马数字的一些一般规则
如何验证任意字符串是否是有效的罗马数字?让我们逐位分析。由于罗马数字总是从高位写到低位,让我们从最高位开始:千位。对于 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} 语法 >> |