我正在使用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位数字的组?
答案 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.findall
或re.finditer
,而无需包含量化的分组构造r'\d{3}'
,或者在需要时使用以匹配未用其他数字括起来的3位数字,r'(?<!\d)\d{3}(?!\d)'
或r'\b\d{3}\b'
以匹配3位数字作为一个整体。参见sample regex demo。