我在Python 3.6.4中使用以下正则表达式:
import re
regex = r'\d{1,3}[-\s]?\d{3}[-\s]?\d{3}'
m = re.match(regex, '12377-456-789')
以上代码的输出为:
<_sre.SRE_Match object; span=(0, 9), match='12377-456'>
7.2。 re —在线Python文档中的正则表达式操作:
https://docs.python.org/2/library/re.html#regular-expression-syntax
说以下话:
{m}指定应精确匹配前一个RE的m个副本;较少的匹配会导致整个RE不匹配。例如,a {6}将完全匹配六个'a'字符,而不是五个。
{m,n}导致结果RE匹配先前RE的m到n个重复,并尝试匹配尽可能多的重复。
因为连字符或空格[-\ s]?在\ d {1,3}之后是可选的,我们并没有\ d {3}要求的3位数字,而是只有两位数字77和一个连字符。那么Python如何返回匹配项?
根据官方描述,正则表达式不应该与字符串匹配,但令人惊讶的是!
所以我想知道Python如何获得上述匹配输出。
非常感谢。
答案 0 :(得分:0)
开头没有与\d{3}
匹配-如您所说,如果是这种情况,则无法正确匹配。由于量词(例如{1,3}
)是贪婪的,因此它首先尝试查找以\d{3}
开头的整个RE的匹配项,但是失败了,因此随后检查了以\d{2}
开头的匹配,确实成功。如果将最初的\d
重复放在一个组中,而其余的RE放在另一个组中,则可以清楚地看到这一点:
import re
regex = r'(\d{1,3})([-\s]?\d{3}[-\s]?\d{3})'
print(re.match(regex, '12377-456-789').groups())
输出:
('12', '377-456')
答案 1 :(得分:0)
正则表达式\d{1,3}[-\s]?\d{3}[-\s]?\d{3}
与12377-456
中的12377-456-789
匹配如下:
Step 1: 123
Step 2: 123 => ok
Step 3: 123 => backtrack
Step 4: 12
Step 5: 12 => ok
Step 6: 12377
Step 7: 12377-
Step 8: 12377-456
Match found in 8 steps.