2010-05-07 203 views
0

如果我字符串如python字典從字符串轉換?

"{ partner_name = test_partner}" OR " { partner_name : test_partner } 

它的一個例子字符串將是非常複雜的幾個特殊字符,包括像=,[,],{}

會是怎樣轉換的最佳方式它變成一個Python對象 - 所以我可以處理它

我試過用eval,但它需要「'」爲字符串,但我們怎麼能在每個字的開始和結束之前添加這個特殊字符',我試過正規快遞re.findal('\ w +'),但是當我的字符串包含'_'或類似字符時失敗,因爲它將分隔條ng'_'

這個問題的對象是我的應用程序需求,用戶友好的語言作爲輸入 - 我認爲Json Dict會很好 - 但用戶是lazzy在每個字符串之前和之後放置「'」。

然後我想到yaml,但它也很複雜,如果有人可以建議更好的用戶友好輸入,我用它作爲python對象 - 那麼請幫助我。

回答

3

如果YAML是爲您的用戶太複雜,你或許應該考慮給他們一個結構化的輸入表格,並從那裏正確格式化數據。對於指定結構來說,YAML寫起來儘可能簡單,當然比花括號語法更容易。

+0

最後我們去了YAML語法!謝謝回答 – shahjapan 2010-05-07 14:28:35

1

修復輸入將是最好的解決方案。

但是你可以跳過一系列的箍試圖通過json輸入parsable。這是脆弱的,因爲你的輸入不是精確的,而且不同的輸入可以很容易地解決這個問題(雖然它仍然是imo優於平淡的使用eval)。

>>> import json 
>>> s = '{ partner_name = test_partner}' 
>>> t = s.replace(' ', '') # strip whitespace 
>>> t = t.replace('=', '":"') 
>>> t = t.replace('{','{"') 
>>> t = t.replace('}','"}') 
>>> json.loads(t) 
{u'partner_name': u'test_partner'} 
0
>>> import ast 

>>> ast.literal_eval("{ 'partner_name' : 'test_partner' }") 
{'partner_name': 'test_partner'} 

copied from

編輯

您可以使用regular expressions

>>> import re 
>>> m = re.match(r"(?P<partner_name>\w+) = (?P<test_partner>\w+)", "foo = bar") 
>>> m.groupdict() 
{'partner_name': 'foo', 'test_partner': 'bar'} 
>>> 
+1

literal_eval它只是一個安全版本的eval,我的問題仍然存在問題,用戶不希望在w的每個開始和結尾都放置sting文字ORDS。 – shahjapan 2010-05-07 09:16:33

+1

查看編輯答案。它可能有幫助。:) – 2010-05-07 09:34:31

0

你可以替換或刪除任何不必要的字符

>>> s 
'{ partner_name = test_partner }' 
>>> s = ''.join([c for c in s.replace('=', ':') if not c in '\ {}']) 
>>> s 
'partner_name:test_partner' 

,然後一分爲二的字符串創建一個字典

>>> dict([s.split(':')]) 
{'partner_name': 'test_partner'} 

或更新

>>> your_dict.update([s.split(':')])