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

从JPEG提取文本后用正则匹配日期,strptime转换报错求助

问题分析与解决

出错原因

你遇到的ValueError是因为日期格式字符串用错了:

  • %B对应的是完整的月份名称(比如June),但你匹配到的是缩写形式Jun,这时候应该用%b(对应英文月份缩写)。

修正后的基础代码

把格式字符串改成%d-%b-%Y就能正常解析了:

import re as r
from datetime import datetime

text = "7225811153; BillNo4896TableNoR306 07-Jun-201921:18:40"
# 匹配日期部分
match_obj = r.search(r'\d{2}-\w{3}-\d{4}', text)
if match_obj:  # 先判断是否匹配到结果,避免空对象报错
    date = datetime.strptime(match_obj.group(), '%d-%b-%Y').date()
    print(date)  # 输出:2019-06-07

更优的实现方案

考虑到你的文本里日期后面还跟着时间(21:18:40),可以一次性提取完整的日期时间,同时让正则更严谨,还能避免匹配失败的异常:

  1. 优化正则,处理日期和时间连在一起的情况
  2. 添加异常处理,提升代码健壮性
  3. 用命名分组提升正则可读性
import re
from datetime import datetime

text = "7225811153; BillNo4896TableNoR306 07-Jun-201921:18:40"

# 正则匹配:拆分日期和时间部分(处理两者连在一起的场景)
pattern = re.compile(r'(?P<date>\d{2}-\w{3}-\d{4})(?P<time>\d{2}:\d{2}:\d{2})')
match_result = pattern.search(text)

if match_result:
    try:
        # 拼接日期和时间字符串,统一解析
        full_datetime_str = f"{match_result.group('date')} {match_result.group('time')}"
        full_datetime = datetime.strptime(full_datetime_str, '%d-%b-%Y %H:%M:%S')
        print("完整日期时间:", full_datetime)
        print("仅日期部分:", full_datetime.date())
    except ValueError as e:
        print(f"解析日期失败:{e}")
else:
    print("未找到匹配的日期时间格式")

额外小技巧

如果你的JPEG提取文本中日期格式可能有变化(比如不同的月份写法、分隔符),可以用第三方库python-dateutil的parser模块,它能自动识别多种日期格式,不用手动写格式字符串:

from dateutil import parser
from datetime import datetime
import re

text = "7225811153; BillNo4896TableNoR306 07-Jun-201921:18:40"
match_obj = re.search(r'\d{2}-\w{3}-\d{4}', text)
if match_obj:
    date = parser.parse(match_obj.group()).date()
    print(date)

使用前需要先安装库:pip install python-dateutil

内容的提问来源于stack exchange,提问作者Sid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:47:57