2012-04-30 48 views
6

我有格式的Python字符串Python字典:得到的字符串包含鍵值對

str = "name: srek age :24 description: blah blah" 

有沒有辦法把它轉換到字典中,看起來像

{'name': 'srek', 'age': '24', 'description': 'blah blah'} 

其中每個條目是從字符串中獲取的(鍵,值)對。我試圖通過

str.split() 

,然後手動刪除:,檢查每個標籤名分割字符串列表,添加到字典中。這種方法的缺點是:這種方法是討厭的,我必須爲每一對手動刪除:,如果字符串中有多字「值」(例如,blah blahdescription),每個單詞將是一個單獨的條目列表這是不可取的。有沒有Pythonic的方式來獲取字典(使用Python 2.7)?

+0

你......刪除以前的問題只是再問吧... –

+0

是啊..有失誤這個問題 – srek

+0

(題外話,但),請不要使用'str'作爲變量名稱。這是[內建字符串類型]的名稱(http://docs.python.org/library/functions.html#str)。 –

回答

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'作爲變量名稱。這是內置字符串類型的名稱。同樣的原因你不使用var名稱,如'list'和'dict'。 –

+0

@ShawnChin謝謝!我沒有注意到OP使用的名稱。 –

+0

沒有probs。我也會將該評論複製到問題中,只是讓OP瞭解。 –

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

正則表達式:超過9000 –

0

Aswini方案的其他變化,這在原始順序顯示字典

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')]