Python re.findall()获取所有匹配的组

时间:2017-01-11 14:06:00

标签: python regex regex-greedy

这是分隔文本,但我想用正则表达式解析它。

第二列,下一列需要几秒或几毫秒。

>>> import re 
>>> s = '''aaa
bbb|30s
ccc|500ms|1s'''
>>> re.findall(r'(\w+)(?:\|(\d+(?:s|ms)))?(?:\|(\d+(?:s|ms)))?', s)

输出(预期答案):

[('aaa', '', ''), ('bbb', '30s', ''), ('ccc', '500ms', '1s')]

我想通过使用像*或{x,y}这样的量词来缩短这种模式。

所以我做了:

>>> re.findall(r'(\w+)(?:(?:\|(\d+(?:s|ms)))*)', cmdstr)

[('aaa', ''), ('bbb', '30s'), ('ccc', '500ms')]  # WRONG

我失败了。

我该怎么做这个正则表达式?

2 个答案:

答案 0 :(得分:1)

[('aaa', '', ''), ('bbb', '30s', ''), ('ccc', '500ms', '1s')]

输出:

{{1}}

答案 1 :(得分:1)

您似乎在询问是否可以使用可变数量的正则表达式组。基于快速谷歌搜索,答案似乎是否定,正则表达式将匹配完整模式,但只有最后一个值将记录为同一组的重复匹配。

考虑简单地执行s.split('|'),然后执行每个子字符串所需的任何检查。