有没有办法解析下面的时间而不使用像s.spilt()
这样的hacky多次?
s = 'PT1H28M26S'
我想得到:
num_mins = 88
答案 0 :(得分:5)
您可以使用regular expression:
>>> match = re.search(r"PT(\d+)H(\d+)M(\d+)S", s)
>>> h, m, s = map(int, match.groups())
>>> num_mins = h * 60 + m
>>> num_mins
88
答案 1 :(得分:3)
您可以使用time.strptime函数将字符串转换为日期对象,然后只需使用hour
和minute
获取tm_hour
和tm_min
方法:
>>> import time
>>> t=time.strptime('PT1H28M26S', "PT%HH%MM%SS")
time.struct_time(tm_year=1900, tm_mon=1, tm_mday=1, tm_hour=1, tm_min=28, tm_sec=26, tm_wday=0, tm_yday=1, tm_isdst=-1)
>>> t.tm_hour * 60 + t.tm_min
88
答案 2 :(得分:2)
您可以使用基本切片和字符串方法:
s = 'PT1H28M26S'
num_mins = int(s[s.find('H')-1]) * 60 + int(s[s.find('H')+1:s.find('M')])
答案 3 :(得分:2)
删除P,T和M,然后使用平移切片,然后使用split:
提取小时和分钟s = 'PT1H28M26S'
hr, min = map(int, s.translate(None,"PTMS")[:-2].split("H"))
print(hr,min)
(1, 28)
如果您可能有几位数的秒数,请将它们关闭:
hr,min = map(int,s[2:].rstrip("0123456789S")[:-1].split("H"))
有些时间表明发现是最有效的,时间最少:
In [38]: r = re.compile(r"PT(\d+)H(\d+)M(\d+)S")
In [39]: %%timeit
....: match = r.search(s)
....: h, m, _ = map(int, match.groups())
....:
100000 loops, best of 3: 3.16 µs per loop
In [40]: timeit t=time.strptime('PT1H28M2S', "PT%HH%MM%SS")
100000 loops, best of 3: 13.3 µs per loop
In [41]: timeit hr, min = map(int,s[2:].rstrip("0123456789S")[:-1].split("H"))
100000 loops, best of 3: 1.96 µs per loop
In [43]: timeit num_mins = int(s[s.find('H')-1]) * 60 + int(s[s.find('H')+1:s.find('M')])
1000000 loops, best of 3: 1.54 µs per loop
答案 4 :(得分:1)
我不确定我会将拆分解决方案称为“hacky”。它不是最短的,但它很简单:
import re
HMS = [ 60, 1, 0 ]
parts = [int(x) for x in re.split('\D', s) if x != ""]
num_mins = sum([ v * u for v, u in zip(parts, HMS) ])