我有几千个文件名中包含日期时间的文件。
可悲的是,日期时间块之间的划分并不总是相同的。
例:
- Data_trul-100A1-Berlin_2019-01-31_150480.dat
- Data_tral-2000B2-Frankf-2018_02_27-190200.dat
- Data_bash-300003_Hambrg_2017-04-12_210500.dat
我设法在带有正则表达式的字符串中找到日期时间部分
import re
strings = ['Data_trul-100A1-Berlin_2019-01-31_150430.dat',
'Data_tral-2000B2-Frankf-2018_02_27-190200.dat',
'Data_bash-300003_Hambrg_2017-04-12_210500.dat']
for part_string in strings:
match = re.search('d{4}[-_]d{2}[-_]d{2}[-_]d{6}', part_string)
print(match.group())
但是,现在我不得不将组转换为日期时间
from datetime import datetime
date = datetime.strptime(match.group(), "%Y-%m-%d_%H%M%S")
因为我需要指定破折号或下划线。
我想出了以下解决方案来替换它,但这感觉就像作弊。
for part_string in strings:
part_string = part_string.replace('-',"_")
match = re.search('d{4}_d{2}_d{2}_d{6}', part_string)
date = datetime.strptime(match.group(), "%Y_%m_%d_%H%M%S")
print(date)
还有比这更优雅的方式吗?使用正则表达式找到分隔符并将其传递给 strptime?
您可以更改正则表达式以查找 4 个单独的元素
match = re.search('(d{4})[-_](d{2})[-_](d{2})[-_](d{6})', part_string)
然后将它们组合成一种标准字符串格式
fixedstring = "{}_{}_{}_{}".format(match.groups())
date = datetime.strptime(match.group(), "%Y_%m_%d_%H%M%S")
当然,此时您可以将 HHMMSS 部分时间拆分为它们自己的元素并直接构建 datetime 对象,
m = re.search('(d{4})[-_](d{2})[-_](d{2})[-_](d{2})(d{2})(d{2})', part_string)
date = datetime.datetime(year=m.group(0),
month=m.group(1),
day=m.group(2),
hour=m.group(3),
minute=m.group(4),
second=m.group(5))