您当前位置: 首页 > 深入 Python > 正则表达式 > 使用 {n,m} 语法 | << >> | ||||
深入 Python从 Python 新手到专家 |
在上一节中,您处理了一个模式,其中同一个字符可以重复最多三次。在正则表达式中还有另一种表达方式,有些人认为这种方式更易读。首先看看我们在前面的例子中已经使用过的方法。
>>> 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?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?M?(CM|CD|D?C?C?C?)(XC|XL|L?X?X?X?)(IX|IV|V?I?I?I?)$'
那么使用这种备选的 {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>
如果您按照所有这些步骤操作并在第一次尝试时就理解了,那么您做得比我当时好。现在想象一下,在大型程序的关键函数中,试图理解别人的正则表达式。或者甚至想象一下,几个月后回到您自己的正则表达式。我经历过,那可不是什么好事。
在下一节中,您将探索一种可以帮助您保持表达式可维护性的备选语法。
<< 案例研究: 罗马数字 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
详细正则表达式 >> |