我正在尝试存储带有时区的时间戳,并且我需要一个正则表达式模式来正确执行此操作。使用以下示例说明该格式:
2014-12-01 17:15:52
2014-12-01 17:15:52.213121
2014-12-01 17:15:52 Africa/Cairo
2014-12-01 17:15:52.213121 Africa/Cairo
所有均为有效时间戳记。换句话说,微秒的精度是可选的,时区也是可选的。时区可以视为字符串。到目前为止,我有以下模式:
r'^\d\d\d\d-(0?[1-9]|1[0-2])-(0?[1-9]|[12][0-9]|3[01]) (00|[0-9]|1[0-9]|2[0-3]):([0-9]|[0-5][0-9]):([0-9]|[0-5][0-9])*$'
这仅适用于存储必需的部分,即没有微秒的精度和时区。我有点不知道该如何处理。
我是否应该使用|
并在其中拥有所有模式,一个模式具有不带微秒的微秒,一个模式具有不带微秒的时区,一个不带微秒,两个都带?
感谢您的帮助。
注意:由于不可避免地会有人提出这一点,因此我完全理解,仅使用正则表达式模式无法验证日期时间。我打算使用此模式将字符串分割开,并验证每个部分,以确保时间戳有效或无效。因此,请不要评论或回答提及该细节。
答案 0 :(得分:1)
您可以通过在正则表达式的末尾添加2个可选的非捕获组来更新正则表达式,以匹配点和1+个数字(如.213121
,并使用正斜杠将模式匹配为Africa/Cairo
,例如\S
匹配任何非空白字符。
如果\S
的匹配范围太广,则可以指定character class列出所有允许的字符。
(?:\.\d+)?(?: \S+\/\S+)?$
请注意,该组([0-9]|[0-5][0-9])*
不需要量词,因此您可以省略*
如果正斜杠前后的内容也可以包含空格,则也可以使用:
(?:\.\d+)?(?: [^\r\n\/]+\/[^\r\n\/]+)?