datetime への変換

日付時刻文字列から datetime オブジェクトを求めるのに、
正規表現
日付の正規表現 - Oboe吹きプログラマの黙示録

時刻正規表現 - Oboe吹きプログラマの黙示録

これらで毎回チェックしてから datetime.strptime を実行するのは面倒くさいです。
Java と違って存在しない日付も Python strptime はエラーにしてくれます。

でも、チェックも変換も両方一度にしたいです。(わがまま。。)

datetimetool.py

from datetime import datetime
import re

class Datetimetool():
    def __init__(self, format):
        self.__format = format
        self.__regex = format.replace('-', '\-')\
                .replace('%Y', '\d{4}')\
                .replace('%m', '(0[1-9]|1[012])')\
                .replace('%d', '(0[1-9]|[12][0-9]|3[01])')\
                .replace('%H', '(0[0-9]|1[0-9]|2[0-3])')\
                .replace('%M', '(0[0-9]|[0-5][0-9])')\
                .replace('%S', '(0[0-9]|[0-5][0-9])')
    @property
    def regex(self):
        return self.__regex
    def parse(self, str, errout=False):
        try:
            if re.match(self.__regex, str):
                return (True, datetime.strptime(str, self.__format))
            else:
                if errout: raise ValueError('%s is not date format %s' % (str, self.__format))
                return (False, None)
        except BaseException as e:
            if errout: raise e
            return (False, None)

実行、インスタンス生成で、%Y,%m,%d,%H,%M,%S によるフォーマットを指定します。
一見、わかりづらい長くて間違いやすい正規表現を書きません。

from datetimetool import Datetimetool

dtool = Datetimetool('parse %Y-%m-%d %H:%M:%S test')

r = dtool.parse('parse 2020-12-08 21:08:16 test', True)
print(r)
# (True, datetime.datetime(2020, 12, 8, 21, 8, 16))

タプルの[0] でチェックできます。
タプルの[1] に、datetimeが入ります。

dtool = Datetimetool('parse %Y-%m-%d test')
r = dtool.parse('parse 2020-11-31 test')
print(r)
# (False, None)
if not r[0]:
    print('NG')
# NG

エラーは、errout=True で例外発生させます

r = dtool.parse('parse 2020-11-31 test', errout=True)
# ValueError: day is out of range for month
r = dtool.parse('parse 2020-12-8 test', errout=True)
# ValueError: parse 2020-12-8 test is not date format parse %Y-%m-%d test