在日期正则表达式中优先考虑稍后的捕获组
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 组:零到两位数字,一个可选的 .
,然后是零个或多个数字。
我正在准备一个 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 组:零到两位数字,一个可选的.
,然后是零个或多个数字。