Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在Python3中使用正则表达式_Regex_Python 3.x - Fatal编程技术网

Regex 在Python3中使用正则表达式

Regex 在Python3中使用正则表达式,regex,python-3.x,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条。有关在线Python文档中的正则表达式操作,请访问: 他说: {m} 指定应匹配前一个RE的正好m个

在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条。有关在线Python文档中的正则表达式操作,请访问:

他说:

{m} 指定应匹配前一个RE的正好m个副本;较少的匹配会导致整个RE不匹配。例如,一个{6}将恰好匹配六个“a”字符,而不是五个

{m,n}使结果RE与前面RE的m到n个重复匹配,尝试匹配尽可能多的重复

因为连字符或空格[-\s]?在\d{1,3}之后是可选的,我们没有\d{3}所需的3个数字,而是只有两个数字77后跟连字符。那么Python是如何返回匹配的呢

根据官方的描述,正则表达式不应该与字符串匹配,但令人惊讶的是它确实匹配

因此,我想知道如何通过Python获得上述匹配输出


非常感谢。

一开始它与
\d{3}
不匹配-正如您所说,如果是这样,它就不会正确匹配。由于量词(如
{1,3}
)是贪婪的,它首先尝试为整个重新开始的
\d{3}
找到匹配项,但失败了,因此它检查了以
\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')

正则表达式
\d{1,3}[-\s]?\d{3}[-\s]?\d{3}
12377-456-789
中匹配
12377-456
,如下所示:

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.

我很确定匹配
12
中的第一组数字,然后第二组和第三组匹配
377
456
。非常感谢您的回答和对网站regex101的极好参考,该网站可以帮助调试和理解regex。我忘记了\d{1,3}有一个上限,所以它最多匹配三次,并且接受的次数也少于三次。继续努力!当答案解决问题时,请考虑将其标记为接受,以表明问题已解决。