我在列表中有一堆持续时间如下
['23m3s', '23:34', '53min 3sec', '2h 3m', '22.10', '1:23:33', ...]
你可以猜到,有N种时间格式的排列使用。
从Python中的每个元素中提取持续时间(以秒为单位)的最有效或最简单的方法是什么?
答案 0 :(得分:2)
这可能仍然有点粗糙,但它似乎为你到目前为止发布的所有数据做了诀窍。第二个总数都达到了我的预期。 re
和timedelta
的组合似乎可以解决这个小样本的问题。
>>> 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
您可以在遇到更多数据时添加更多正则数据,但仅限于某个范围。