2010-09-09 29 views
5

Estoy escribiendo una aplicación que implica que los usuarios entran en la época de en el siguiente formato:Analizando 'cadena de tiempo' con Python?

1m30s # 1 Minute, 30 Seconds 

3m15s # 3 Minutes, 15 Seconds 

2m25s # 2 Minutes, 25 Seconds 

2m # 2 Minutes 

55s # 55 Seconds 

Los datos pueden tener un único "designación minutos", un "segundo designación", o ambas cosas. Lo que es la forma correcta de analizar estas cadenas en un formato similar a:

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

Respuesta

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

Soy demasiado lento. Tú ganas. – nmichaels

5

Regex al rescate!

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

Editar: Aquí es una solución revisada:

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) 

Salidas:

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

Nice! Estaba trabajando en una respuesta similar, pero la tuya es mejor. Nunca supe nombrar a los grupos de partidos así. – Colin