regex - 在 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 获得上述匹配输出。
非常感谢。
解决方案
一开始它不匹配\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')
推荐阅读
- html - 如何使文本框不接受 < 或 >
- c# - 使用 Azure 图形 API 获取用户下的用户列表
- swiftui - SwiftUI - 显示图像数组
- ios - 如何使用在 swiftui 中存储为 UserDefaults 的环境变量创建 http 连接?
- elasticsearch - 在 date_histogram + 嵌套 ES 查询中需要帮助
- python - 在 Pandas Dataframe 的排序列中查找缺失的数字
- c++ - 使用 Ctrl + Shift + B 构建时,VS Code 终端不运行 C++ 程序
- macos - 在 macOS 中使用 chmod 的权限
- apache - 将 HTTP 请求重定向为使用 HTTPS 时会出现什么问题?
- java - 使用 Java/JPA/Hibernate 在 create table 语句中为列设置排序规则和语言环境