Python Regex:混合格式字符串持续时间到秒

时间:2014-01-06 01:14:51

标签: python regex string

我在列表中有一堆持续时间如下

['23m3s', '23:34', '53min 3sec', '2h 3m', '22.10', '1:23:33', ...]

你可以猜到,有N种时间格式的排列使用。

从Python中的每个元素中提取持续时间(以秒为单位)的最有效或最简单的方法是什么?

1 个答案:

答案 0 :(得分:2)

这可能仍然有点粗糙,但它似乎为你到目前为止发布的所有数据做了诀窍。第二个总数都达到了我的预期。 retimedelta的组合似乎可以解决这个小样本的问题。

>>> import re
>>> from datetime import timedelta

首先是正则表达词典:根据您的评论更新

d = {'hours': [re.compile(r'(\d+)(?=h)'), re.compile(r'^(\d+)[:.]\d+[:.]\d+')],
     'minutes': [re.compile(r'(\d+)(?=m)'), re.compile(r'^(\d+)[:.]\d+$'),
     re.compile(r'^\d+[.:](\d+)[.:]\d+')], 'seconds': [re.compile(r'(\d+)(?=s)'),
     re.compile(r'^\d+[.:]\d+[.:](\d+)'), re.compile(r'^\d+[:.](\d+)$')]}

然后是一个尝试正则表达式的函数(可能还是有点粗糙):

>>> def convert_to_seconds(*time_str):
    timedeltas = []
    for t in time_str:
        td = timedelta(0)
        for key in d:
            for regex in d[key]:
                if regex.search(t):
                    if key == 'hours':
                        td += timedelta(hours=int(regex.search(t).group(1)))
                    elif key == 'minutes':
                        td += timedelta(seconds=int(regex.search(t).group(1)) * 60)
                    elif key == 'seconds':
                        td += timedelta(seconds=int(regex.search(t).group(1)))
        print(td.seconds)

结果如下:

>>> convert_to_seconds(*t)
1383
1414
3183
7380
1330
5013

您可以在遇到更多数据时添加更多正则数据,但仅限于某个范围。