使用Python正则表达式验证日期格式

使用Python正则表达式验证日期格式,python,regex,Python,Regex,我想检查用户输入的日期格式是否与以下内容匹配: Jan 5 2018 6:10 PM Month: First letter should be caps, followed 2 more in small. (total 3 letters) <Space>: single space, must exist Date: For single digit it should not be 05, but 5 <Space>: single space, must ex

我想检查用户输入的日期格式是否与以下内容匹配:

Jan 5 2018 6:10 PM

Month: First letter should be caps, followed 2 more in small. (total 3 letters)
<Space>: single space, must exist
Date: For single digit it should not be 05, but 5
<Space>: single space, must exist
Hour: 0-12, for single digit it should not be 06, but 6
Minute: 00-59
AM/PM

但是,即使是正确的格式,它也会给出一个
语法错误
错误。我做错了什么。

我不会使用正则表达式,因为您无法实际验证日期本身(例如,正则表达式很乐意接受Abc 99 9876 9:99 PM)

相反,请使用strtime:

from datetime import datetime

string = 'Jan 5 2018 6:10 PM'
datetime.strptime(string, '%b %d %Y %I:%M %p')
如果字符串的格式为“错误”,则会出现
ValueError

这种方法唯一明显的“问题”是,出于某种原因,您要求日期和时间不进行零填充,
strtime
似乎没有这样的指令


包含所有可用指令的表是。

您可以使用一个函数来解析输入字符串并尝试返回
datetime
对象,如果它不能返回,则会引发
ValueError

from datetime import datetime

def valid_date(s):
    try:
        return datetime.strptime(s, '%Y-%m-%d %H:%M')
    except ValueError:
        msg = "Not a valid date: '{0}'.".format(s)
        raise argparse.ArgumentTypeError(msg)

[1-31]
匹配
1
2
3
。字符类的工作方式与您想象的不同。@WiktorStribiżew您的答案是正确的,但您将其作为“注释”输入。把它写成一个“答案”,提问者可以给你的答案打分!我可以问一下,为什么使用这种格式,而不是可以被
datetime.strtime
轻松解析的格式?@ReutSharabani上面的代码是一个更大的代码的一部分,定义了很多函数。我已经有了一些函数,我正在用
datetime.strtime
解析日期的不同部分,但这在我的程序中已经很先进了。在去那里之前,我想保留一个validate函数,在这里我验证来自用户的所有输入,如果不验证,程序将退出,并且不再继续。此外,我不想用多个
try:except:
绑定我的程序模块。一、 相反,我使用的是捕获所有异常的
sys.excepthook
。我在查询中提到的这段代码是一个更大的代码的一部分,定义了很多函数。我已经有了一些函数,我正在用
datetime.strtime
解析日期的不同部分,但这在我的程序中已经很先进了。在去那里之前,我想保留一个validate函数,在这里我验证来自用户的所有输入,如果不验证,程序将退出,并且不再继续。此外,我不想将我的程序模块绑定到多个try:except:。一、 相反,我使用的是捕获所有异常的
sys.excepthook
from datetime import datetime

def valid_date(s):
    try:
        return datetime.strptime(s, '%Y-%m-%d %H:%M')
    except ValueError:
        msg = "Not a valid date: '{0}'.".format(s)
        raise argparse.ArgumentTypeError(msg)