如何将正则表达式与具有未知数量的组的分组匹配

Lor*_*ein 25 python regex

我想在程序的输出日志上进行正则表达式匹配(在Python中).日志包含一些如下所示的行:

... 
VALUE 100 234 568 9233 119
... 
VALUE 101 124 9223 4329 1559
...
Run Code Online (Sandbox Code Playgroud)

我想捕获在以VALUE开头的第一次出现之后发生的数字列表.即,我希望它返回('100','234','568','9233','119').问题是我事先并不知道会有多少数字.

我试图用这个作为正则表达式:

VALUE (?:(\d+)\s)+
Run Code Online (Sandbox Code Playgroud)

这匹配线,但它只捕获最后一个值,所以我得到('119',).

Gre*_*ill 21

您正在寻找的是解析器,而不是正则表达式匹配.在您的情况下,我会考虑使用一个非常简单的解析器,split():

s = "VALUE 100 234 568 9233 119"
a = s.split()
if a[0] == "VALUE":
    print [int(x) for x in a[1:]]
Run Code Online (Sandbox Code Playgroud)

您可以使用正则表达式来查看输入行是否符合您预期的格式(使用问题中的正则表达式),然后您可以运行上面的代码而无需检查"VALUE"并知道int(x)转换将始终成功,因为您已经确认以下字符组都是数字.


Ian*_*and 11

>>> import re
>>> reg = re.compile('\d+')
>>> reg.findall('VALUE 100 234 568 9233 119')
['100', '234', '568', '9223', '119']
Run Code Online (Sandbox Code Playgroud)

这不会验证关键字"VALUE"是否出现在字符串的开头,并且它不会验证项目之间是否只有一个空格,但是如果您可以将其作为单独的步骤(或者如果您不这样做)根本不需要这样做,然后它会在任何字符串中找到所有数字序列.


Sco*_*mas 5

此处未描述的另一个选项是拥有一堆可选的捕获组。

VALUE *(\d+)? *(\d+)? *(\d+)? *(\d+)? *(\d+)? *$
Run Code Online (Sandbox Code Playgroud)

此正则表达式捕获最多 5 个由空格分隔的数字组。如果您需要更多潜在组,只需复制并粘贴更多*(\d+)?块即可。