2010-09-09 19 views
5

मैं एक आवेदन उपयोगकर्ताओं को निम्नलिखित प्रारूप में समय का प्रवेश होने शामिल है कि लिख रहा हूँ:पाइथन के साथ 'टाइम स्ट्रिंग' पार्सिंग?

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

5

बचाव के लिए Regex!

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

संबंधित मुद्दे