陷入Python 3中的正则表达式

时间:2018-08-04 05:03:14

标签: regex python-3.x

我在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如何获得上述匹配输出。

非常感谢。

2 个答案:

答案 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')

https://regex101.com/r/PuUCu1/1

答案 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.