>>> a = re.search('(\\d+h)?(\\d+m)?(\\d+s)?', 'in 1h15m')
>>> a.groups()
(None, None, None)
>>> a = re.search('.*(\\d+h)?(\\d+m)?(\\d+s)?', 'in 1h15m')
>>> a.groups()
(None, None, None)
>>> a = re.search('...(\\d+h)?(\\d+m)?(\\d+s)?', 'in 1h15m')
>>> a.groups()
('1h', '15m', None)
为什么“...”版本是唯一填充“群组”的版本?
答案 0 :(得分:2)
为什么我们会变空组?
第一个 - a?a?a
与"bbbaaa"
匹配:
a
,但无法找到。那没关系,它是可选的,所以不配。 (x 3次)第二个 - .*a?a?a
与"bbbaaa"
匹配:
.*
。a
,但无法找到它。那没关系,它是可选的,所以不配。 (x 3次)如何解决此问题?
目前还不清楚你究竟想要做什么,但你可以匹配:
\d+h(\d+m)?(\d+s)?|(\d+m)(\d+s)?|(\d+s)
这可以确保您匹配至少一个元素 - 至少在选项上不是可选的。然后,如果没有任何组可用,则正则表达式将无法匹配。您可以在第二步中解析它以获取组,或者如果支持则使用组替换功能(?| | )
。