导航: 起始页 > Dive Into Python > 正则表达式 > 使用{n,m} 语法 | << >> | ||||
Python 研究(Dive Into Python)Python 从新手到高手 [DIP_5_4_CPUG_RELEASE] |
在 前面的章节,你处理了相同字符可以重复三次的情况,在正则表达式中有另外一个方式来表达这种情况,并且使代码的可读性更好。首先来看我们在前面的例子中使用的方法。
例 7.5. 老方法:每一个字符都是可选的
>>> 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')
>>>
例 7.6. 一个新的方法:From n to m
>>> 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')
>>>
![]() | |
没有一个轻松的方法来确定两个正则表达式是否为等价的,你能采用的最好的办法就是列出很多的测试样例,确定这两个正则表达式对所有的相关输入都有相同的输出。在本书后面的章节,关于如何书写测试样例有更多的讨论。 |
现在我们来扩展扩展关于罗马数字的正则表达式,以匹配十位数和个位数,下面的例子展示十位数的校验方法。
例 7.7. 校验十位数
>>> pattern = '^M?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')
>>>
对于个位数的正则表达式有类似的表达方式i,我将省略细节,直接展示结果。
>>> pattern = '^M?M?M?M?(CM|CD|D?C?C?C?)(XC|XL|L?X?X?X?)(IX|IV|V?I?I?I?)$'
用另一种{n,m}语法表达这个正则表达式会如何呢?这个例子展示新的语法。
例 7.8. 用{n,m}语法确认罗马数字
>>> pattern = '^M{0,4}(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, 'MMMMDCCCLXXXVIII')
<_sre.SRE_Match object at 0x008EEB48> >>> re.search(pattern, 'I')
<_sre.SRE_Match object at 0x008EEB48>
![]() | |
本章译者注:这个例子在正则表达式的匹配上没有问题,但是对于罗马数字的表示办法本身似乎有点问题,代表千位数的字符M,根据规定最多只能重复3次,但是在这个例子中重复了4次,但是这个罗马数字最后又表示3888,此处矛盾。不过,我们是为了搞清楚正则表达式的用法,罗马数字的表示法不是重点,因此从这个角度,这个例子没有问题。因此,在翻译的过程中保持了原文,大家在理解的时候需要注意一下这里。 |
如果你在第一遍就跟上并理解了所讲的这些,那么你做的比我还要好。现在,你可以尝试着理解别人大规模程序里关键函数中的正则表达式了。或者想象着几个月后回头理解你自己的正则表达式。我曾经做过这样的事情,但是它并不是那么好看。
在下一节里,你将会研究另外一种正则表达式语法,它可以使你的表达式具有更好的可维持性。
<< 个案研究:罗马字母 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
松散正则表达式 >> |