Python调用datetime.strptime配合regex校验触发ValueError问题排查
代码逻辑错误点
- 正则表达式逻辑错误:你写的
r'^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}|.*)'中,|.*会匹配所有内容,当输入为仅含日期的字符串(如2021-10-01)时,分组1会成功匹配到完整的输入字符串,rv变量是有有效值的,不会进入你写的else分支,依旧会尝试用带时分秒的格式解析,所以抛出同样的错误。 - 分支判断逻辑错误:你用
if rv:作为判断条件,只能判断是否匹配到内容,无法区分匹配到的是长日期格式还是短日期格式,分支完全起不到分流作用。 - 类型判断写法不严谨:使用
type(given) != str判断类型,无法兼容str子类的场景,推荐用isinstance方法。
修复方案
推荐两种可行的实现方式:
方案1:调整正则+按匹配结果分流解析
修改正则分别捕获两种格式,判断匹配结果后选择对应解析方式:
import re from datetime import datetime def convStr2Date(given): if not isinstance(given, str): return given # 优先匹配长格式,分组1为长格式,分组2为短格式 pattern = r'^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})|(\d{4}-\d{2}-\d{2})$' match_res = re.search(pattern, given) if not match_res: # 无匹配可根据需求返回原值或抛出异常 return given long_date, short_date = match_res.groups() if long_date: return datetime.strptime(long_date, '%Y-%m-%d %H:%M:%S') elif short_date: return datetime.strptime(short_date, '%Y-%m-%d') return given
方案2:用try-except容错解析(更简洁,兼容性更强)
不需要正则匹配,直接按优先级尝试解析,后续新增格式只需加对应except分支即可:
from datetime import datetime def convStr2Date(given): if not isinstance(given, str): return given try: # 优先尝试长格式解析 return datetime.strptime(given, '%Y-%m-%d %H:%M:%S') except ValueError: try: # 长格式失败尝试短日期格式 return datetime.strptime(given, '%Y-%m-%d') except ValueError: # 都失败可返回原值或自定义抛出异常 return given
内容的提问来源于stack exchange,提问作者Jonnyboi
相关产品推荐
相关产品推荐

