我正在使用以这种格式输出时间的外部程序。
15mn
1h 15mn 3sc
34 sc
如何将所有这些字符串转换为秒,即(15mn = 900秒)?
答案 0 :(得分:1)
另一个:
如果您只是指定一个功能,可以在其后面提取具有特定标签的数字......
def fs(x, p):
p = re.sub('\s+', '', p) # get rid of spaces ...
if re.search('[0-9]+'+x, p): # exp = (n digits) + (tag 'x')
return int( re.search('[0-9]+'+x, p).group()[:-len(x)] )
else: return 0
然后您可以随后使用这些数字进行计算......
def toSec(p): return fs('h',p)*3600 + fs('mn',p)*60 + fs('sc',p)
答案 1 :(得分:1)
使用re
a dict
获取乘数,例如:
import re
text = '1h 15mn 3sc'
in_seconds = {'h': 60 * 60, 'mn': 60, 'sc': 1}
seconds = sum(int(num) * in_seconds[weight] for num, weight in re.findall(r'(\d+)\s?(mn|sc|h)', text))
# 4503
重要的是要注意,这允许构造如" 1h 3mn 5h 3sc 12mn 2h 5sc"所以可能不可取......
答案 2 :(得分:0)
我使用(相当复杂:))正则表达式来解析你的字符串。
>>> def s_to_secs(s):
import re
mat = re.match(r"((?P<hours>\d+)\s?h)?\s?((?P<minutes>\d+)\s?mn)?\s?((?P<seconds>\d+)\s?sc)?", s)
secs = 0
secs += int(mat.group("hours"))*3600 if mat.group("hours") else 0
secs += int(mat.group("minutes"))*60 if mat.group("minutes") else 0
secs += int(mat.group("seconds")) if mat.group("seconds") else 0
return secs
>>> for s in ("15mn", "1h 15mn 3sc", "34 sc"):
print(s_to_secs(s))
900
4503
34
答案 3 :(得分:0)
在此寻找其他东西。这是使用Python Pints
更为简洁的解决方案import pint
ureg = pint.UnitRegistry()
ureg.define("mn = minutes") # Define non-standard units
ureg.define("sc = seconds")
ureg.define("h = hours")
def parse_odd_time_format(s):
duration = ureg("0 seconds") # Just something to initialize
for x in s.split(" "):
duration += ureg(x) # Parse all the bits and add them together
return duration.magnitude # Split off the seconds
parse_odd_time_format("1h 15mn 3sc")