我想写一个正则表达式,匹配时间在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')]
[]
[]