首页 > 解决方案 > 在 Python 3 中遇到正则表达式

问题描述

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

非常感谢。

标签: regexpython-3.x

解决方案


一开始它不匹配\d{3}- 正如你所说,如果是这种情况,它就不会正确匹配。由于量词(例如{1,3})是 贪婪的,它首先尝试为以 开头的整个 RE 寻找匹配\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')

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


推荐阅读