2011-01-21 14 views
9

में कुंजी = मान स्ट्रिंग अलग इस प्रकार मैं स्ट्रिंग है: इस प्रकारशब्दकोश बनाना अजगर

s = 'key1=1234 key2="string with space" key3="SrtingWithoutSpace"' 

मैं एक शब्दकोश में में कनवर्ट करना चाहते हैं:

 
key | value 
-----|-------- 
key1 | 1234 
key2 | string with space 
key3 | SrtingWithoutSpace 

मैं यह करने के लिए कैसे करते हैं पायथन में?

+0

क्या होना चाहिए अगर आपके स्ट्रिंग ' 'कुंजी 1 =" "foo" बार कुंजी 2 = "baz'' है? –

+0

मैं एक लॉग फ़ाइल का आउटपुट पार्सिंग कर रहा हूं और मुझे किसी भी अन्य प्रारूप में आउटपुट की उम्मीद नहीं है। –

उत्तर

15

इस प्रयास करें:

>>> import re 
>>> dict(re.findall(r'(\S+)=(".*?"|\S+)', s)) 
{'key3': '"SrtingWithoutSpace"', 'key2': '"string with space"', 'key1': '1234'} 

आप भी उद्धरण पट्टी करना चाहते हैं:

>>> {k:v.strip('"') for k,v in re.findall(r'(\S+)=(".*?"|\S+)', s)} 
+0

धन्यवाद। यह मेरी समस्या हल हो गई। –

+0

मुझे समझ में नहीं आ रहा है कि रेगेक्स आर '(\ S +) = ("। *?" | \ S +)' है, जैसा कि आर '(\ S +) = (\ "। *? \" | \ एस +) '। क्या आपको विशेष चरित्र से बचने की ज़रूरत नहीं है? या आप बस इतना जानते हैं कि "पाइथन रेगेक्स में कोई विशेष अर्थ नहीं है? – AlanSE

18

shlex वर्ग आसान सरल वाक्यविन्यास की कि जैसी लिए शाब्दिक विश्लेषक लिखने के लिए बनाता है यूनिक्स खोल यह अक्सर minilanguages ​​लिखने के लिए उपयोगी होगा, (उदाहरण के लिए, पाइथन अनुप्रयोगों के लिए नियंत्रण फ़ाइलों में) या उद्धृत तारों को पार्स करने के लिए।

import shlex 

s = 'key1=1234 key2="string with space" key3="SrtingWithoutSpace"' 

print dict(token.split('=') for token in shlex.split(s)) 
संबंधित मुद्दे