如何在Python 2.x中实现严格的日期解析?
实现严格的日期解析,要求月份必须为两位数字
当然可以实现严格匹配的日期解析!默认情况下,Python的datetime.strptime会采用宽松的解析规则,所以像"1082018"这种单数字开头的字符串会被“自动补零”解析成10月8日。但从Python 3.7版本开始,strptime新增了strict参数,刚好能解决你的需求——当日期字符串不符合指定格式的严格要求时,直接抛出ValueError。
方法一:使用strict=True参数(Python 3.7+)
只需要在调用strptime时加上strict=True,就能强制要求格式完全匹配:
from datetime import datetime # 符合格式的情况:月份是两位,解析成功 datetime.strptime("01082018", "%m%d%Y", strict=True) # 返回:datetime.datetime(2018, 1, 8, 0, 0) # 不符合格式的情况:月份只有一位,直接抛出错误 try: datetime.strptime("1082018", "%m%d%Y", strict=True) except ValueError as e: print(e) # 输出:time data '1082018' does not match format '%m%d%Y'
方法二:兼容Python 3.7以下版本
如果你还在使用低于3.7的Python版本,可以先通过正则表达式验证日期字符串的格式,确认月份是两位数字后再解析:
from datetime import datetime import re def strict_parse_date(date_str): # 正则匹配:必须是两位月份+两位日期+四位年份,总共8位数字 if not re.fullmatch(r'\d{2}\d{2}\d{4}', date_str): raise ValueError("日期格式不符合要求,必须是MMDDYYYY格式的8位数字") return datetime.strptime(date_str, "%m%d%Y") # 测试符合格式的情况 strict_parse_date("01082018") # 正常返回datetime对象 # 测试不符合格式的情况 try: strict_parse_date("1082018") except ValueError as e: print(e) # 输出:日期格式不符合要求,必须是MMDDYYYY格式的8位数字
这样就能确保只有完全符合MMDDYYYY格式(月份和日期都是两位)的字符串才能被成功解析,不符合的会直接触发错误,避免了宽松解析带来的意外结果。
内容的提问来源于stack exchange,提问作者user1516083
相关产品推荐
相关产品推荐

