日付時刻文字列から datetime オブジェクトを求めるのに、
正規表現、
日付の正規表現 - 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