文字列から日付っぽいものが含まれていれば取り出す
たとえば以下の文字列群があった場合、
180203 20180203 20180203050601 180203_050601 20180203_050601 180203050601 Image20180203050601 file180203.jpg
それぞれ”2018-02-03 00:00:00”というdatetimeオブジェクトを取得できるようにしたい
今回採用した方法は以下
# coding: UTF-8 import re from datetime import datetime f = open('timetest.txt') # 上記の文字列が記載されたファイル lines = f.readlines() f.close() # 6桁の数字のマッチをすべて取得し、最初に日付に変換できたものを使用 # 初回マッチでループを抜ける matchFlag = False for line in lines: print('■for ', line.strip()) # 6桁以上の最大桁数で数字マッチ imgdates = re.findall('(\d{6}\d*)', line) if imgdates: # 数字6桁(以上)がマッチした場合 print(len(imgdates) ,' matched.') # マッチした文字列それぞれについて検証 for imgdate in imgdates: # マーカーを一文字ずつ進めて、そこからの6桁の数字でマッチング for i in range(0,len(imgdate)-5): slicedstr = imgdate[i:i+6] print('in ', slicedstr) try: dt = datetime.strptime(slicedstr, r'%y%m%d') except ValueError: print('digits is not date') else: print('date digits', dt) matchFlag = True break # imgdate走査 if matchFlag: break # マッチ文字列群 # if文は勝手にぬける # 文字列をイテレートしている最初のループは抜けない
1.6桁以上の数字列を最大長ですべて抜き出す
2. 抜き出した文字列に対して、先頭から順に6桁抜き出して、日付(%y%m%d=yymmdd)とマッチするか確認
3.初回マッチにてその文字列の処理を終了、次の文字列を検証する
といった仕組み。
出力は以下。
■for 180203 1 matched. in 180203 date digits 2018-02-03 00:00:00 ■for 20180203 1 matched. in 201802 digits is not date in 018020 digits is not date in 180203 date digits 2018-02-03 00:00:00 ■for 20180203050601 1 matched. in 201802 digits is not date in 018020 digits is not date in 180203 date digits 2018-02-03 00:00:00 ■for 180203_050601 2 matched. in 180203 date digits 2018-02-03 00:00:00 ■for 20180203_050601 2 matched. in 201802 digits is not date in 018020 digits is not date in 180203 date digits 2018-02-03 00:00:00 ■for 180203050601 1 matched. in 180203 date digits 2018-02-03 00:00:00 ■for Image20180203050601 1 matched. in 201802 digits is not date in 018020 digits is not date in 180203 date digits 2018-02-03 00:00:00 ■for file180203.jpg 1 matched. in 180203 date digits 2018-02-03 00:00:00
ループ抜け処理に以下を参考にさせてもらった。
Pythonで多重ループ(ネストしたforループ)からbreak | note.nkmk.me