从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),可以一次性提取完整的日期时间,同时让正则更严谨,还能避免匹配失败的异常:
- 优化正则,处理日期和时间连在一起的情况
- 添加异常处理,提升代码健壮性
- 用命名分组提升正则可读性
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
相关产品推荐
相关产品推荐

