在日期正则表达式中优先考虑稍后的捕获组

Giving more priority to later capture group in date regex

我正在准备一个 Python 正则表达式来匹配时间增量的特殊格式。

以下是我将输入到正则表达式中的一些字符串示例:

1:42.15 (1)
19.78 (1)
2-24:04
8:03.280 (1)

所以整体格式是hour-minute:second.second_fractions,有时用零填充。出现在某些字符串末尾的括号中的数字必须忽略。

我想使用三个捕获组来匹配每一行,以便第一组始终是小时,第二组始终是分钟,第三组始终是秒和第二小数。

我写了这个正则表达式:(\d{0,2})-?(\d{0,2}):?(\d{0,2}\.?\d*)

这成功匹配了我试过的所有示例,但是有一个问题。由于匹配正则表达式的贪婪方式,例如缺少小时时,第一个捕获组而不是我预期的第二个捕获分钟。

也就是说,输入 1:42.15 (1) 我得到输出 ('1', '', '42.15')。我真正想要的是输出 ('', '1', '42.15') - 分钟总是对应于第二个捕获组。

如何修改捕获组的优先级以实现此行为?

您可以让前两个可选部分包含强制分隔符,并使用

^(?:(\d{0,2})-)?(?:(\d{0,2}):)?(\d{0,2}\.?\d*)

regex demo详情:

  • ^ - 字符串开头
  • (?:(\d{0,2})-)? - 一个可选的非捕获组,匹配一次或零次出现
    • (\d{0,2}) - 第 1 组:零到两位数
    • - - 一个连字符
  • (?:(\d{0,2}):)? - 一个可选的非捕获组,匹配一次或零次出现
    • (\d{0,2}) - 第 2 组:零到两位数
    • : - 冒号
  • (\d{0,2}\.?\d*) - 第 3 组:零到两位数字,一个可选的 .,然后是零个或多个数字。