首页 > 解决方案 > 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}“不起作用。
你能帮我找出错误吗?

谢谢你。问候。

标签: pythonregex

解决方案


您快到了,但您应该按如下方式进行更改:

pattern = "\d{1,3}(?:\s\d{3}){0,2}"

?:使组不捕获,因此findall将返回整个匹配项,而不仅仅是组。如链接文档所述:

如果模式中存在一个或多个组,则返回组列表


推荐阅读