2010-09-09 88 views
5

我正在寫涉及使用戶按以下格式輸入時間的應用程序:用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 
} 

回答

7
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

5

正則表達式來拯救!

>>> 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