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

3
我希望检查用户输入的日期格式是否与以下格式相匹配:
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

我将使用以下正则表达式进行匹配:

我正在使用以下正则表达式并尝试匹配:

import re,sys
usr_date = str(input("Please enter the older date until which you want to scan ? \n[Date Format Example: Jan 5 2018 6:10 PM] :  "))

valid_usr_date = re.search("^(\s+)*[A-Z]{1}[a-z]{2}\s{1}[1-31]{1}\s{1}[1-2]{1}[0-9]{1}[0-9]{1}[0-9]{1}\s{1}[0-12]{1}:[0-5]{1}[0-9]{1}\s{1}(A|P)M$",usr_date,re.M)

if not valid_usr_date:
    print ("The date format is incorrect. Please follow the exact date format as shown in example. Exiting Program!")
    sys.exit()

即使按照正确的格式,也会出现“语法错误”的提示。我做错了什么。


[1-31] 匹配 123。字符类并不像你想象的那样工作。 - Wiktor Stribiżew
1
@WiktorStribiżew,你的答案是正确的,但你把它输入为“评论”。请将其写成“答案”,这样提问者就可以给你的答案打分了! - Jim DeLaHunt
我可以问一下为什么使用这种格式,而不是datetime.strptime可以轻松解析的格式吗? - Reut Sharabani
@ReutSharabani 以上代码是较大代码的一部分,其中定义了许多函数。我已经有了某些函数,用datetime.strptime解析了日期的不同部分,但这在我的程序中还很遥远。在进入那里之前,我想保持一个验证函数,在那里我验证来自用户的所有输入,如果无法验证,则程序退出并且不再继续。此外,我不想将程序模块绑定到多个try: except:上。相反,我正在使用sys.excepthook来捕获所有异常。 - dig_123
2个回答

8
我不会在这种情况下使用正则表达式,因为您无法实际验证日期本身(例如,正则表达式将高兴地接受Abc 99 9876 9:99 PM)。
相反,请使用strptime
from datetime import datetime

string = 'Jan 5 2018 6:10 PM'
datetime.strptime(string, '%b %d %Y %I:%M %p')

如果字符串格式不正确,你将收到一个ValueError错误。
这种方法唯一明显的“问题”是,由于某种原因,你需要天数和小时数不带前导零,而strptime似乎没有这样的指令。
所有可用指令的表格在此处

1
您可以使用一个函数,该函数解析输入字符串并尝试返回一个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)

我在查询中提到的这段代码是一个更大的代码的一部分,其中定义了许多函数。我已经有了某些函数,我正在使用datetime.strptime解析日期的不同部分,但这在我的程序中还远远不够。在那之前,我想保留一个验证函数,在那里我验证用户的所有输入,如果不通过验证,程序将退出并且不会继续执行。此外,我不想将我的程序模块与多个try: except:绑定在一起。相反,我正在使用sys.excepthook来捕获所有异常。 - dig_123

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接