Python将时间字符串“4d12h33m59s”分割成碎片

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python将时间字符串“4d12h33m59s”分割成碎片相关的知识,希望对你有一定的参考价值。

我想知道是否有人可以帮助提出一个优雅的解决方案,如何将从路由器的格式"4d12h33m59s" API收到的时间字符串拆分成碎片。

问题是字符串可能是动态大小。例如,它可以是"4d12h33m59s""12h33m59s""12y14w4d12h33m59s""12m23s""33s"

是否有任何优雅的方法来分割字符串并得到如下列表:

received_string = "12y14w4d12h33m59s"
time_list = convert_string(received_string)

print(time_list) 
["12y","14w","4d","12h","33m","59s"]
答案

你可以使用regular expression

import re

time_list = re.findall('d+[a-z]', received_string)

re.findall() function生成输入字符串中给定模式的所有匹配的列表。此处模式查找1个或更多数字,后跟一个小写ASCII字母。

你可以通过使用[ywdhms]让它变得更加挑剔,但如果你的输入结构合理,我就不用担心了。

演示:

>>> import re
>>> received_string = "12y14w4d12h33m59s"
>>> re.findall('d+[a-z]', received_string)
['12y', '14w', '4d', '12h', '33m', '59s']

但是,您可能希望进一步拆分数字和字母,以便更容易将信息转换为更易于使用的格式,如datetime.timedelta()对象,也许可以转换为字典:

{type_: int(count) for count, type_ in re.findall('(d+)([a-z])', received_string)}

增加的(..)分组改变了re.findall()输出以产生每个匹配的元组,包含单独的组值(所以('12', 'y')('14', 'w')等)。

这产生了

{'y': 12, 'w': 14, 'd': 4, 'h': 12, 'm': 33, 's': 59}

供您参考。

另一答案

Martijn的答案和往常一样出色。我只是想在这个转换中使用timedelta的方式扩展:

import datetime, re, operator, functools
times = {'s': datetime.timedelta(seconds=1),
         'm': datetime.timedelta(minutes=1),
         'h': datetime.timedelta(hours=1),
         'd': datetime.timedelta(days=1),
         'w': datetime.timedelta(weeks=1),
         'y': datetime.timedelta(days=365)}
fieldre = re.compile(r'(d+)([{}])'.format(''.join(times.keys())))

samplevalue = "12y14w4d12h33m59s"

duration = functools.reduce(operator.add, 
     (times[unit]*int(value) for (value,unit) in 
      fieldre.findall(samplevalue)))

remains = fieldre.subn("", samplevalue)
if remains:
    raise ValueError("Unexpected time fields in {!r}: {!r}".format(
        samplevalue, remains))

不可否认,最后一点是一团糟。请注意,年份单位是粗略近似值(365天)。我使用dict.keys提取那些单位并允许它们在正则表达式中,正则表达式中的括号生成值和单位作为一对,functools.reduce(operator.add, iterable)作为sum的替代,因为后者不适用于timedelta。最后,我们有一个时间点,我们可以读取标准化的时间,例如: duration.total_seconds()

可能更有用的是我添加了一种方法来检测我们是否使用subn留下了一些东西。错误的数据可能比检测无效的转换更有害。

以上是关于Python将时间字符串“4d12h33m59s”分割成碎片的主要内容,如果未能解决你的问题,请参考以下文章

Python将字符串转换为本地日期时间到UTC日期时间

Python将日期时间字符串转换为日期

python 将字符串转换为日期时间

python - 如何在没有dateutil的情况下将时区感知字符串转换为Python中的日期时间?

Python / Pandas将字符串解析为日期和时间[重复]

如何将python时间戳字符串转换为纪元?