python - datetime.strptime 基于正则表达式模式检查
问题描述
我正在使用以下功能
def convStr2Date(given):
if type(given) != str:
return given
pattern = r'^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}|.*)'
rv = re.search(pattern, given).group(1)
if rv:
return datetime.strptime(rv, '%Y-%m-%d %H:%M:%S')
这给了我错误ValueError: time data '2021-10-01' does not match format '%Y-%m-%d %H:%M:%S
所以我添加了一个else:
语句,但仍然得到同样的错误,我哪里出错了?
试:
def convStr2Date(given):
if type(given) != str:
return given
pattern = r'^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}|.*)'
rv = re.search(pattern, given).group(1)
if rv:
return datetime.strptime(rv, '%Y-%m-%d %H:%M:%S')
else:
return datetime.strptime(rv, '%Y-%m-%d')
解决方案
如果你不关心确切的模式,你可以只测试一个空间。无论如何,您的代码在其他日期模式上都会失败。
from datetime import datetime
def convStr2Date(given: str) -> datetime:
if not isinstance(given, str):
raise ValueError(f"{given!r} is not a string")
date_format = '%Y-%m-%d'
if ' ' in given :
date_format = '%Y-%m-%d %H:%M:%S'
return datetime.strptime(given, date_format)
例子
for d in ['2021-10-02', '2018-10-20 01:21:23', 'not a date', 'notADate', 2, None]:
try:
print(convStr2Date(d))
except ValueError as e:
print(e)
输出
2021-10-02 00:00:00
2018-10-20 01:21:23
time data 'not a date' does not match format '%Y-%m-%d %H:%M:%S'
time data 'notADate' does not match format '%Y-%m-%d'
2 is not a string
None is not a string
推荐阅读
- python - 如何在 Django 中加密 URL 信息?
- c++ - c++20 可能和不可能的性能优化
- django - 如何使用返回模型实例而不是字典的 QuerySet API 执行 GROUP BY 查询?
- r - 用 R 中面板数据的系列平均值估算缺失的观测值
- javascript - 不同的应用程序如何从共享组件文件夹中导入?反应/反应原生
- java - 是否可以通过 Android Studio 创建 Excel 电子表格?
- angular - 只运行被点击的按钮
- java - 在真实物体上模拟“何时”
- excel - Redim Preserve 触发“超出范围”错误
- sql - 在 Microsoft SQL Server Management Studio 中获取此错误消息