You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 15:54:05