在使用正则表达式组时遇到问题

时间:2012-07-16 10:01:08

标签: python regex

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

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

1 个答案:

答案 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)

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