2012-04-30 27 views
6

मैं प्रारूप में एक अजगर स्ट्रिंग है जिसमें स्ट्रिंग से अजगर शब्दकोश मिल स्ट्रिंग से लिया गया (कुंजी, मूल्य) जोड़े हैं। मैं द्वाराकुंजी मान जोड़े

str.split() 

और फिर मैन्युअल : को दूर करने, प्रत्येक टैग नाम की जाँच सूची में स्ट्रिंग बंटवारे की कोशिश की, एक शब्दकोश में जोड़ने से। इस विधि की कमी यह है: यह विधि गंदा है, मुझे प्रत्येक जोड़ी के लिए : मैन्युअल रूप से निकालना होगा और यदि स्ट्रिंग में बहु शब्द 'मान' है (उदाहरण के लिए, blah blahdescription के लिए), प्रत्येक शब्द एक अलग प्रविष्टि होगा सूची जो वांछनीय नहीं है। क्या शब्दकोश प्राप्त करने का कोई पाइथोनिक तरीका है (पायथन 2.7 का उपयोग करके)?

+0

आप ... पिछले प्रश्न हटाए गए बस इसे फिर से उस सवाल –

+0

हाँ .. वहाँ थे गलतियों (विषय से हटकर, लेकिन) का उपयोग नहीं करें एक चर नाम के रूप में 'str'। यह [अंतर्निहित स्ट्रिंग प्रकार] का नाम है (http://docs.python.org/library/functions.html#str)। – srek

+0

में पूछने के लिए ... –

उत्तर

2

re बिना:

r = "name: srek age :24 description: blah blah cat: dog stack:overflow" 
lis=r.split(':') 
dic={} 
try : 
for i,x in enumerate(reversed(lis)): 
    i+=1 
    slast=lis[-(i+1)] 
    slast=slast.split() 
    dic[slast[-1]]=x 

    lis[-(i+1)]=" ".join(slast[:-1]) 
except IndexError:pass  
print(dic) 

{'age': '24', 'description': 'blah blah', 'stack': 'overflow', 'name': 'srek', 'cat': 'dog'} 
+0

कृपया एक चर नाम के रूप में 'str' का उपयोग न करें। वह अंतर्निहित स्ट्रिंग प्रकार का नाम है। वही कारण है कि आप 'सूची' और 'dict' जैसे विभिन्न नामों का उपयोग नहीं करते हैं। –

+0

@ShawnChin धन्यवाद! मैंने ओपी द्वारा उपयोग किए गए नामों को नहीं देखा। –

+0

कोई जांच नहीं। मैं टिप्पणी को भी प्रश्न पर कॉपी करूंगा, बस ओपी को पता है। –

30
>>> r = "name: srek age :24 description: blah blah" 
>>> import re 
>>> regex = re.compile(r"\b(\w+)\s*:\s*([^:]*)(?=\s+\w+\s*:|$)") 
>>> d = dict(regex.findall(r)) 
>>> d 
{'age': '24', 'name': 'srek', 'description': 'blah blah'} 

स्पष्टीकरण:

\b   # Start at a word boundary 
(\w+)  # Match and capture a single word (1+ alnum characters) 
\s*:\s*  # Match a colon, optionally surrounded by whitespace 
([^:]*)  # Match any number of non-colon characters 
(?=   # Make sure that we stop when the following can be matched: 
\s+\w+\s*: # the next dictionary key 
|   # or 
$   # the end of the string 
)   # End of lookahead 
+4

रेगेक्स स्तर: 9 000 से अधिक –

0

अश्विनी कार्यक्रम के अन्य भिन्नता जो मूल क्रम में शब्दकोश प्रदर्शित

import os 
import shutil 
mystr = "name: srek age :24 description: blah blah cat: dog stack:overflow" 
mlist = mystr.split(':') 
dict = {} 
list1 = [] 
list2 = [] 
try: 
for i,x in enumerate(reversed(mlist)): 
    i = i + 1 
    slast = mlist[-(i+1)] 
    cut = slast.split() 
    cut2 = cut[-1] 
    list1.insert(i,cut2) 
    list2.insert(i,x) 
    dict.update({cut2:x}) 
    mlist[-(i+1)] = " ".join(cut[0:-1]) 
except: 
pass 

rlist1 = list1[::-1] 
rlist2= list2[::-1] 

print zip(rlist1, rlist2) 

आउटपुट

[('name', 'srek'), ('age', '24'), ('description', 'blah blah'), ('cat', 'dog'), ('stack', 'overflow')]

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