python - 正则表达式非捕获组
问题描述
我有一个任务是有 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)
打印输出时将忽略“:”
解决方案
如果您绝对需要这四个组,请删除?
量词:
^([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)$
推荐阅读
- nix - 在非 NixOS Linux 上从 Nix 为 Amazon 构建 NixOS AMI 映像
- java - JAXB 使用命名空间检索内部元素(返回空白)
- docker - 如何在 docker 中更新 python 包?
- c++ - C++ 程序不会用向量打印任何东西?
- amazon-web-services - EC2 html 页面将无法加载
- python - 如何从连续运行的函数中动态更新 Kivy 标签?
- python - ValueError:x 和 y 变量似乎都不是数字
- node.js - 当我上传 html 文件时 Cheerio 不起作用
- python - 有没有办法在 Python 中链接多个 if 语句,以便它们同时运行?
- tensorflow - 当损失再次开始上升时,这意味着什么?