正则表达式不能匹配同一类型的多个组

时间:2018-06-21 11:39:51

标签: python regex

我正在使用python中的Regex。我知道有很多有关此的文档。但我只是无法理解这个看似简单的示例:

关于此代码:

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位数字组,因此我希望将它们全部打印出来。我在做什么错?我也尝试使用+而不是*,据我的理解,该Feature: Login Action Scenario Outline: Successful Login with Valid Credentials Given User is on Home Page When User enters "<UserName>" and Password Then Message displayed Login Successfully Examples: | UserName | | Rob | | Bob | | Cob | 应该至少找到一次该组。如果这样做,它只会打印第一组,而不是我期望的全部。我应该如何写才能打印出所有3位数字的组?

2 个答案:

答案 0 :(得分: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']

答案 1 :(得分:1)

您已经定义了repeated capturing group(\d\d\d)*模式匹配并捕获到ID为1的捕获组中的任何3位数字,或更多次(由于*的限制),也就是说,如果存在字符串内某个位置没有数字,将捕获一个空字符串,如果连续有6个数字,它们将全部匹配,但是捕获组内存缓冲区将包含最后3个字符。请参见your pattern demo启用了多个匹配

但是,在您的代码中,您使用的是re.search,该方法仅返回单个(第一个)匹配项。由于引擎尝试从左到右匹配字符串,因此它将检查起始位置并找到M。它不是数字,因此模式与M之前的空字符串匹配(由于*量词)。

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

作为快速解决方案,您可以使用+量词,重复1次或更多次,但仍将返回位于每个数字块末尾的3个数字块。

解决方案是使用多重匹配方法,例如re.findallre.finditer,而无需包含量化的分组构造r'\d{3}',或者在需要时使用以匹配未用其他数字括起来的3位数字,r'(?<!\d)\d{3}(?!\d)'r'\b\d{3}\b'以匹配3位数字作为一个整体。参见sample regex demo