首页 > 解决方案 > 正则表达式非捕获组

问题描述

我有一个任务是有 4 个组。第一组是数字,第二组是数字,第三组是数字,最后一组是 pm 或 am (am|pm)

但是,如果我这样写:

^([1-9]|[1-2][0-2]?)(:[1-5][0-9]|0[1-9])?(:[1-5][0-9]|0[1-9])?(am|pm)$

它将为第 2 组和第 3 组返回 (:number),并且我想将“:”放在非捕获组中,因此我将其稍微更改为以下代码:

^([1-9]|[1-2][0-2]?)(?::)?([1-5][0-9]|0[1-9])?(?::)?([1-5][0-9]|0[1-9])?(am|pm)$

但是, 6::pm 被评估为合法表达式。当提示字符串“:”时,如何使此表达式起作用,必须提示一个数字,同时它不会在包含我的数字的组内捕获“:”?返回语句应为:

(number, number, number, am or pm) instead of (number, :number, :number, am or pm)

编辑:

pattern = ^([1-9]|[1-2][0-2]?)(?::)?([1-5][0-9]|0[1-9])?(?::)?([1-5][0-9]|0[1-9])?(am|pm)$
Input = "6:30am"
x = re.match(pattern, Input)
print(x.groups())

>>> (6,30,none,am)

打印输出时将忽略“:”

标签: pythonregex

解决方案


如果您绝对需要这四个组,请删除?量词:

^([1-9]|[1-2][0-2]?):([1-5][0-9]|0[1-9]):([1-5][0-9]|0[1-9])(am|pm)$

https://regex101.com/r/R2m8VR/1

编辑:如果你不需要秒,下面的就足够了:

^([1-9]|[1-2][0-2]?):([1-5][0-9]|0[1-9])(am|pm)$

https://regex101.com/r/plvz3V/1

编辑:如果:是可选的,将其放入带有?量词的非捕获组中,因此带有 the:和最后两位数字的组将变为可选:

^([1-9]|[1-2][0-2]?)(?::([1-5][0-9]|0[1-9]))?(am|pm)$

https://regex101.com/r/plvz3V/2


推荐阅读