2010-09-09 21 views
5

Ich bin eine Anwendung schreiben, die Benutzer eingeben Zeit des im folgende Format mit beinhaltet: eine einzige „Minute Bezeichnung“ könnenParsing 'Zeit Zeichenfolge' mit Python?

1m30s # 1 Minute, 30 Seconds 

3m15s # 3 Minutes, 15 Seconds 

2m25s # 2 Minutes, 25 Seconds 

2m # 2 Minutes 

55s # 55 Seconds 

Die Daten haben, eine einzige „zweite Bezeichnung“ oder beides. Was ist der richtige Weg, um diese Zeichenfolgen in ein ähnliches Format zu parsen:

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

Antwort

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

Ich bin zu langsam. Du gewinnst. – nmichaels

5

Regex zur Rettung!

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

Edit: Hier ist eine überarbeitete Lösung:

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) 

Ausgänge:

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

Nice! Ich habe an einer ähnlichen Antwort gearbeitet, aber deine ist besser. Ich wusste nie, wie man die Match-Gruppen so nennt. – Colin