Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python re.groups不';不显示所有的子组_Python_Regex - Fatal编程技术网

Python re.groups不';不显示所有的子组

Python re.groups不';不显示所有的子组,python,regex,Python,Regex,我有一个类似于'234 3452789 23 901234…'的字符串。我想提取所有的数字。我编写了以下正则表达式: s = '234 3452789 23 901234' expr = r'^\s*(\d+\s*)+$' e = re.match(expr, s) print e.groups() 我希望看到一个包含所有数字的元组,但实际上这段代码只打印最新的数字: ('901234',) ('901234',) 问题:我的代码中有什么错误,如何修复 p.S.下面的代码运行良好,但我想解

我有一个类似于
'234 3452789 23 901234…'
的字符串。我想提取所有的数字。我编写了以下正则表达式:

s = '234 3452789 23 901234'
expr = r'^\s*(\d+\s*)+$'
e = re.match(expr, s)
print e.groups()
我希望看到一个包含所有数字的元组,但实际上这段代码只打印最新的数字:

('901234',)
('901234',)
问题:我的代码中有什么错误,如何修复

p.S.下面的代码运行良好,但我想解析具有任意数量子字符串的字符串

expr = r'^\s*(\d+\s*)(\d+\s*)(\d+\s*)(\d+\s*)$'
e = re.match(expr, s)
print e.groups()

你的第一个代码怎么了

r'^\s*(\d++\s*)+$”
regex应该匹配从开始到结束的所有数字或空格字符,并且只捕获最后一个数字字符和以下零个或多个空格,因为您将捕获组重复一次或多次

例如,
'(1+)
(1)+
正在进行相同的匹配,但都捕获了不同的1集。第一个正则表达式捕获所有匹配的1,而第二个正则表达式仅捕获每个匹配中存在的最后1


matchobj.groups()
将返回每个组捕获的所有字符的元组。

结尾处的$将使其仅选择最后一个部分

TL;DR:使用
findall()


我希望看到一个包含所有数字的元组,但实际上这段代码只打印最新的数字:

('901234',)
('901234',)
问题:我的代码有什么问题,如何修复

这就是
match()
的工作原理,您对此无能为力。一个正则表达式包含一个组(如您的),您只返回一个组。在组的右侧指定
+
*
是仅获取最后一个匹配项的方法。它是这样设计的


如果您确实想使用
match()
,第三方模块将提供
捕获
capturesdict
方法,以满足您的需要。但是,它不是标准库的一部分。

由于
^…$
,它匹配整个字符串,并且只捕获
(…)
的最后一个匹配项。我认为这不是一个足够强大的用例,尽管有人提交了一份关于允许在一个列表中累积多个匹配项的申请


groups()
的索引是基于正则表达式中捕获组的布局,而不是它所使用的字符串,因此您不会为每个不同的事件都获得一个组。

我简单的两美分,来回答您的实际问题。。。为什么使用正则表达式,为什么不使用正则表达式

[int(grp) for grp in s.split() if grp.isdigit()]
这将根据空格分隔符将字符串拆分为多个组,遍历已拆分组的列表,检查它是否为数字,如果是,则将该组推送到列表中。检查是为了确保我们只回推数字

它(a)更快


(b)根据我从这里的多次讨论中读到的内容。。。可预测且易于理解。我曾经试图解释
re.findall
re.search
re.split
re.finditer
之间的微妙之处。花了我一些时间。如果可以的话,我的建议是尽量避免使用
re

为什么不试试
r'\d+'
?@AvinashRaj有空格。@AvinashRaj你的意思是re.findall(r'\d+',s)?实际上我可以,但我在这里写了一个简单的例子。我很感兴趣为什么函数
e.groups()
如此有效。我没想到会有这样的行为。如果没有
$
,它会捕获相同的最后一个数字。对不起,我也忘了提到^。另外,您需要使用findall()并将正则表达式更改为expr=r'\s*(\d+)+'好的,如何将所有匹配项收集到组元组中(使用我的方法)?这可能吗?@MaksimSurov:我不知道你的意思。您不能使用
match()
来获取可变数量的组。我可以解释。您的解决方案的问题是它匹配一个类似“234w3452789bla23 901234”的字符串。但是它不需要。@MaksimSurov:在这种情况下,您必须使用
match()
验证字符串,然后使用
findall()
提取值。或者您可以使用的
捕获
功能。或者您可以构建自己的解析器。实际的正则表达式看起来像“^\s*(非常困难的模式)\w+(同样困难的模式)\w+…$”,因此我认为我可以通过
re.match().groups()
验证和提取所有条目。所以,我想从一个文件中提取唯一需要的行。很抱歉,我的解决方案不正确。虽然此代码可以回答问题,但最好解释它如何解决问题以及为什么使用它。从长远来看,只使用代码的答案是没有用的。假设它足够简单…我们将s除以“”。检查每个拆分组是否为一个数字,以及是否将其转换为和int,从而返回一个int列表。如果您试图解决将一个数字字符串转换为int的问题,则不会比这更简单。。。如果您试图找到re.match与re.findall(由少数人建议)相比的工作原理的答案,那么我不会回答您的问题。您也可以尝试计时,看看它是否对实际字符串运行得更快。。。提示它应该请不要向我解释它,编辑你的答案以提高它的质量,并向所有有相同问题的人解释它。我相信代码是不言自明的。。。上面写着“简单”两次……你有什么特别想要的吗?