正则表达式无法匹配多个相同类型的组

3
我正在使用Python中的正则表达式。我知道有很多关于这方面的文档,但是我就是无法理解这个看起来很简单的例子:
在这段代码中:
import re
phoneNumRegex = re.compile(r'(\d\d\d)*')
mo = phoneNumRegex.search('My number is 415-555-4242. 423-531-5412')
print(mo.group())

我期望得到输出:
415, 555, 423, 531

然而,该程序仅返回一个空字符串(什么都没有)。我的逻辑是指定我想要一个3位数字组,然后*指定匹配这种类型的组0或'n'次。由于我在字符串中有多个3位数字组,所以我期望得到所有这些数字组的打印。我做错了什么?我也尝试使用+代替*,根据我的理解,它应该至少找到一次该组。如果我那样做,它只打印第一组,而不是像我预期的那样全部。我应该如何编写代码才能打印出所有的三位数组?

3
使用 re.findall - Rakesh
2
你已经编写了一个返回第一个匹配项的代码。对于 (\d\d\d)* 的第一个匹配项是一个空字符串,因此你会得到一个空字符串。请使用不带 *findall - khelwood
你的问题在于search只返回第一个匹配项。而且因为(\d\d\d)*匹配一个空字符串,所以它返回了一个空字符串。如前所述,请改用findall - Thibault D.
这些答案有没有帮到您?还需要更多关于这个问题的帮助吗? - undefined
2个回答

2

使用re.findall

示例:

import re
phoneNumRegex = re.compile(r'(\b\d{3}\b)')
mo = phoneNumRegex.findall('My number is 415-555-4242. 423-531-5412')
print(mo)

输出:

['415', '555', '423', '531']

我知道findall。但是我想知道我的正则表达式有什么问题,为什么它不能像我期望的那样工作:D - Kennedy

2
你定义了一个重复捕获组。模式(\d\d\d)*匹配并捕获任意3个数字(由于量词符*),零次或多次进入ID为1的捕获组中,也就是说,如果字符串内某个位置没有数字,则会捕获空字符串,如果有6个连续数字,则匹配所有数字,但捕获组记忆缓冲区将包含最后3个数字。请参见启用多次匹配您的模式演示
然而,在您的代码中,您正在使用 re.search 方法,该方法仅返回单个(第一个)匹配项。由于引擎尝试从左到右匹配字符串,它检查起始位置并找到M。它不是数字,因此模式在*量词的作用下匹配M之前的空字符串。

因此,如果您使用re.findall,则将在结果列表中使用模式获得许多空字符串。

作为快速修复,您可以使用+量词,即1个或多个重复项,但它仍将返回位于每个数字块末尾的3位数字块。

解决方案是使用一种多重匹配方法,例如 re.findallre.finditer,不需要一个包含量化分组结构的封闭式,r'\d{3}',或者在你需要匹配一个未被其他数字包围的三位数时,r'(?<!\d)\d{3}(?!\d)'r'\b\d{3}\b' 以整个单词的形式匹配这些三位数块。请参见 示例正则表达式演示

@ Kennedy 很高兴能帮忙。如果它回答了你的问题,请考虑接受。 - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接