如何检测日期时间字符串中的破折号或下划线以在strptime中使用?

时间:2019-04-05 09:59:48

标签: python regex datetime

我有数千个文件名带有日期时间的文件。
可悲的是,日期时间块之间的分隔符并不总是相同。
示例:

  • Data_trul-100A1-柏林_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?

1 个答案:

答案 0 :(得分:1)

您可以更改正则表达式以查找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))