Python 与正则表达式组有问题

Python 与正则表达式组有问题,python,regex,Python,Regex,为什么“…”版本是唯一填充“组”的版本?为什么我们得到的是空组? 第一个-a?a?a与“bbbaaa”匹配: 在第一个位置开始匹配 尝试匹配a,但找不到。没关系,它是可选的,所以不匹配任何内容。(x 3次) 返回一个成功的空匹配,没有成功捕获的组 第二个-*a?a?a与“bbbaaa”匹配: 从第一个位置到最后一个位置匹配* 现在我们已经到了终点 尝试匹配a,但找不到它。没关系,它是可选的,所以不匹配任何内容。(x 3次) 返回与所有原始文本的成功匹配,没有成功捕获的组 如何解决这个问题

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

为什么我们得到的是空组?

第一个-
a?a?a
“bbbaaa”
匹配:

  • 在第一个位置开始匹配
  • 尝试匹配
    a
    ,但找不到。没关系,它是可选的,所以不匹配任何内容。(x 3次)
  • 返回一个成功的空匹配,没有成功捕获的组
第二个-
*a?a?a
“bbbaaa”
匹配:

  • 从第一个位置到最后一个位置匹配
    *
  • 现在我们已经到了终点
  • 尝试匹配
    a
    ,但找不到它。没关系,它是可选的,所以不匹配任何内容。(x 3次)
  • 返回与所有原始文本的成功匹配,没有成功捕获的组
如何解决这个问题?

目前尚不清楚您到底想做什么,但您可以匹配:

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

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

因此:空匹配(无、无、无)是正确的,并在最早的输入位置找到`@乔普-没错!人们通常在默认情况下很贪婪,并尝试匹配最长的字符串。这是一个很好的例子,说明了为什么事实并非如此…@Gary-这正是我在评论中提到的常见错误<代码>*?(\\d+h)-
*?
可以匹配
,然后是也可以匹配
”的
(拉拉)?
,就在第一个位置。这是一场成功的比赛!顺便说一句,所有的风格(语言)在这里的表现都是一样的,这对Python来说并不是特别的,贪婪并不是指整个匹配,只是指它前面的
*
。但是,它将与锚点一起工作:
^.*(a)?$
,如果时间总是在末尾…@Gary-您不必总是编写所有组合。有些风格(如.net)允许您查看和检查组是否匹配。不过,我觉得这一个短了些。:)谢谢!现在我终于明白你的意思了,科比。Phwew。真是过山车。如果存在h,则第一个匹配m或s,或两者都匹配。其他比赛不需要h,因为它已经处理好了。如果没有h,m与可选的s匹配,并且m在下一个中不需要,其中s是剩下的全部。我终于明白了。嘘。我想该睡觉了。再次感谢。
\d+h(\d+m)?(\d+s)?|(\d+m)(\d+s)?|(\d+s)