2010-09-09 37 views
5

Tôi đang viết một ứng dụng có liên quan đến việc người dùng nhập thời gian trong các định dạng sau:Phân tích 'chuỗi thời gian' bằng Python?

1m30s # 1 Minute, 30 Seconds 

3m15s # 3 Minutes, 15 Seconds 

2m25s # 2 Minutes, 25 Seconds 

2m # 2 Minutes 

55s # 55 Seconds 

Các dữ liệu có thể có một "phút định" duy nhất, một "định thứ hai" duy nhất, hoặc cả hai. Cách thích hợp để phân tích các chuỗi này thành một định dạng tương tự như:

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

Trả lời

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

Tôi quá chậm. Bạn thắng. – nmichaels

5

Regex để giải cứu!

>>> 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: Đây là một giải pháp sửa đổi:

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) 

Đầu ra:

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

Nice! Tôi đã làm việc trên một phản ứng tương tự, nhưng bạn là tốt hơn. Tôi không bao giờ biết về việc đặt tên cho các nhóm phù hợp như thế. – Colin

Các vấn đề liên quan