用Python解析'时间字符串'?

问题描述:

我正在写涉及使用户按以下格式输入时间的应用程序:用Python解析'时间字符串'?

1m30s # 1 Minute, 30 Seconds 

3m15s # 3 Minutes, 15 Seconds 

2m25s # 2 Minutes, 25 Seconds 

2m # 2 Minutes 

55s # 55 Seconds 

的数据可以有一个“分型号”单个“第二名称”,或两者兼而有之。什么是正确的方法来解析这些字符串到类似的格式:

{ 
    "minutes" : 3 
    "seconds" : 25 
} 

import re 

tests=['1m30s','3m15s','2m25s','2m','55s'] 
for time_str in tests: 
    match=re.match('(?:(\d*)m)?(?:(\d*)s)?',time_str) 
    if match: 
     minutes = int(match.group(1) or 0) 
     seconds = int(match.group(2) or 0) 
     print({'minutes':minutes, 
       'seconds':seconds}) 

# {'seconds': 30, 'minutes': 1} 
# {'seconds': 15, 'minutes': 3} 
# {'seconds': 25, 'minutes': 2} 
# {'seconds': 0, 'minutes': 2} 
# {'seconds': 55, 'minutes': 0} 
+0

我太慢了。你赢了。 – nmichaels 2010-09-09 20:40:15

正则表达式来拯救!

>>> import re 
>>> minsec = re.compile(r'(?P<minutes>\d+)m(?P<seconds>\d+)s') 
>>> result = minsec.match('1m30s')   
>>> result.groupdict() 
{'seconds': '30', 'minutes': '1'} 

编辑:这里是一个修改后的解决方案:

import re 
pattern = r'(?:(?P<minutes>\d+)m)?(?:(?P<seconds>\d+)s)?' 

minsec = re.compile(pattern) 

def parse(s, pat=minsec): 
    return pat.match(s).groupdict() 

tests = ['1m30s', '30s', '10m29s'] 
for t in tests: 
    print '---' 
    print ' in:', t 
    print 'out:', parse(t) 

输出:

--- 
in: 1m30s 
out: {'seconds': '30', 'minutes': '1'} 
--- 
in: 30s 
out: {'seconds': '30', 'minutes': None} 
--- 
in: 10m29s 
out: {'seconds': '29', 'minutes': '10'} 
+0

不错!我正在研究类似的回应,但你的表现更好。我从不知道如何命名比赛组。 – Colin 2010-09-09 20:39:58