こちらで使った文字を日付として判断するis_date関数の
お話です。
Fletのテキストフィールドでのバリデーション2 - C#ATIA
必要だったため、もうちょっと改修します。
datetime.strptimeメソッドの場合、
'2023-05-22'
は日付として変換出来ますが、
'2023/05/22' '2023年05月22日'
に関しては日付とはしてくれません。想定している利用方法は
手で入力する事は少ないのですが、手で修正を許しているので
これらを許可しないと不便です。
その為、関数を修正しました。
def is_date(txt: str) -> bool: try: pattern = r'(\d+)([年/-])(\d+)([月/-])(\d+)(日)?' res = re.findall(pattern, txt) if len(res) != 1: return False if len(res[0]) != 6: return False word = f'{res[0][0]}-{res[0][2]}-{res[0][4]}' datetime.strptime(word, "%Y-%m-%d") return True except: return False if __name__ == '__main__': txts = [ '2023-05-22', '2023/05/22', '2023年05月22日', '20230522', '2023-02-30', '12023-05-22', '2023-13-22', ] for txt in txts: print(f'{txt}:{is_date(txt)}')
結果はこちらです。
2023-05-22:True 2023/05/22:True 2023年05月22日:True 20230522:False 2023-02-30:False 12023-05-22:False 2023-13-22:False
正規表現のパターンを検索したのですが、以外にもズバリのものが
見つからなかったので作ったのですが、苦労しました・・・。
実際には
2023年05-22/
と言うおかしい表記でも日付として判断してしまっているのですが、
これ以上は思い付きませんでした・・・。