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

为什么“...”版本是唯一填充“组”的版本?

4

1 回答 1

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)

这可确保您匹配至少一个元素 - 至少 on 选项不是可选的。然后,如果没有任何组可用,则正则表达式将无法匹配。您可以在第二步中解析它以获取组,或者在(?| | )支持的情况下使用组交替功能。

于 2012-07-16T10:07:56.613 回答