正则表达式如何将冒号绑定到另一个没有括号的语句



我想写一个正则表达式,匹配时间在1-12小时:0-59分钟:0-59秒+pm/am。小时和pm/am是必需的,min和seconds是可选的,但是当min和sec出现时,它们必须是两位数字。同时,调用.group()方法时,应该有4个组。例如:("6","20",None,"pm")。正则表达式是

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

但是当我这样做的时候:?,它将匹配不正确的对象6::pm。如何解决这个问题?

时间部分的分组是可选的,:

您可以使用模式使用非捕获组使整个时间部分可选,并且在可选组中,匹配第一部分并使第二部分可选以保持顺序。

将am pm部分置于非捕获组之外,因此它是强制性的。

^([0-9]|1[0-2])(?::([0-5][0-9])(?::([0-5][0-9]))?)?([ap]m)$
  • ^字符串
  • 起始
  • ([0-9]|1[0-2])Capture 0 - 12
  • (?:非捕获组
    • :([0-5][0-9])匹配:和捕获00 -59
    • (?::([0-5][0-9]))?可选匹配:和捕获00 - 59
  • )?关闭非捕获组并使其为可选
  • ([ap]m)匹配上午或下午
  • $字符串结束

查看正则表达式演示或Python演示。

import re
pattern = r"^([0-9]|1[0-2])(?::([0-5][0-9])(?::([0-5][0-9]))?)?([ap]m)$"
strings = [
"12:59:59am",
"12:59am",
"12pm",
"12am",
"6::pm",
"12",
]
for s in strings:
print(re.findall(pattern, s))

输出
[('12', '59', '59', 'am')]
[('12', '59', '', 'am')]
[('12', '', '', 'pm')]
[('12', '', '', 'am')]
[]
[]

相关内容

最新更新