如何检测日期时间字符串中要在 strptime 中使用的短划线或下划线



我有几千个文件名中包含日期时间的文件。
可悲的是,日期时间块之间的划分并不总是相同的。
例:

  • 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))

最新更新