Regex 在Python3中使用正则表达式
在Python 3.6.4中,我一直使用以下正则表达式: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个
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}有一个上限,所以它最多匹配三次,并且接受的次数也少于三次。继续努力!当答案解决问题时,请考虑将其标记为接受,以表明问题已解决。