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

Python re.findall() to get all matched groups

这是带分隔符的文本,但我想使用正则表达式对其进行解析。

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

>>> 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

我失败了。

我该如何做这个正则表达式模式?

import re 

s = '''aaa
bbb|30s
ccc|500ms|1s'''

print(re.findall(r'(\w+)\|?(\w+)?\|?(\w+)?', s))

输出:

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

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

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