如何用正则表达式匹配未知数量的分组
我想在一个程序的输出日志上使用正则表达式(在Python中)。这个日志里有一些看起来像这样的行:
...
VALUE 100 234 568 9233 119
...
VALUE 101 124 9223 4329 1559
...
我想要抓取在第一行以“VALUE”开头之后出现的数字列表。也就是说,我希望它返回('100','234','568','9233','119')
。问题是,我事先不知道会有多少个数字。
我尝试使用这个正则表达式:
VALUE (?:(\d+)\s)+
这个表达式能匹配到那一行,但它只抓取到了最后一个值,所以我只得到了('119',)。
6 个回答
5
这里还有一个没有提到的选项,就是可以使用一些可选的捕获组。
VALUE *(\d+)? *(\d+)? *(\d+)? *(\d+)? *(\d+)? *$
这个正则表达式可以捕获最多5组由空格分开的数字。如果你需要更多的数字组,只需复制粘贴更多的 *(\d+)?
代码块就可以了。
14
>>> import re
>>> reg = re.compile('\d+')
>>> reg.findall('VALUE 100 234 568 9233 119')
['100', '234', '568', '9223', '119']
这段话的意思是,它并没有检查关键词'VALUE'是否出现在字符串的开头,也没有检查每个项目之间是否只有一个空格。不过,如果你能把这些检查作为一个单独的步骤来做(或者根本不需要做这些检查),那么它就能在任何字符串中找到所有的数字序列。
29
你需要的是一个解析器,而不是简单的正则表达式匹配。在你的情况下,我建议使用一个非常简单的解析器,split()
:
s = "VALUE 100 234 568 9233 119"
a = s.split()
if a[0] == "VALUE":
print [int(x) for x in a[1:]]
你可以先用正则表达式检查一下你的输入行是否符合预期的格式(用你问题中的正则表达式),然后就可以运行上面的代码,而不需要再检查"VALUE"
,因为你已经确认后面的字符组都是数字,所以int(x)
的转换一定会成功。