python - Python中的正则表达式:无法匹配重复的组号
问题描述
我使用正则表达式来检测 Python 中字符串中从“0”到“999 999 999”的数字。
import re
test_string = "b\'[<span id=\"prl\">114 893</span>]\'"
working_pattern = "\d{1,3}\s\d{3}"
non_working_pattern = "\d{1,3}(\s\d{3}){0,2}"
wk_ptrn = re.findall(working_pattern, test_string)
non_wk_ptrn = re.findall(non_working_pattern, test_string)
print(wk_ptrn)
print(non_wk_ptrn)
结果是:
print(wk_ptrn)
显示:['114 893']
print(non_wk_ptrn)
显示:([' 893']
第一个数字前有一个空格)
non_working_pattern 是"\d{1,3}(\s\d{3}){0,2}"
\d{1,3} :
检测 1 到 3 位数字 [0 到 999]
\s\d{3} :
检测任何后跟 3 位数字 [" 000" 到 " 999"] 的空格
{0,2} :
是一个量词,所以我可以检测"0" (quantifier = 0)
到"999[ 999][ 999]" (quantifier = 2)
.
我不明白为什么"\d{1,3}(\s\d{3}){0,2}
“不起作用。
你能帮我找出错误吗?
谢谢你。问候。
解决方案
您快到了,但您应该按如下方式进行更改:
pattern = "\d{1,3}(?:\s\d{3}){0,2}"
这?:
使组不捕获,因此findall
将返回整个匹配项,而不仅仅是组。如链接文档所述:
如果模式中存在一个或多个组,则返回组列表
推荐阅读
- php - Laravel:在查询构建器咨询中获取软删除的行
- http - ioutil.ReadAll 的替代方案?
- r - 如何在构建自己的专业散点图 GEOM 时更改 x 轴的显示范围?
- android - 聊天未在屏幕上正确呈现
- java - Jhipster Spring Boot 日志设置
- laravel - 如何在多对多关系 Laravel 中检索所有相关模型?
- javascript - React Native - 在按钮按下时打开选择器
- html - 为什么即使我使用正确的格式,html5 视频标签在 Firefox 中也不起作用?
- java - 如何加载现有的 Java 代码并在程序中运行它
- node.js - 护照 saml 请求中缺少“目的地”属性