2013-01-21 95 views
0

我在字符串像以下類似的東西:創建從字符串,看起來像字典對象

myString = "major: 11, minor: 31, name: A=1,B=1,C=1,P=1, severity: 0, comment: this is down" 

我有這個到目前爲止已經試過:

dict(elem.split(':') for elem in myString.split(',')) 

它工作正常直到它捕獲到的名稱元素不能是split()':'。 這些格式的元素我希望作爲新的詞典使用,例如

myDic = {'major':'11', 'minor': '31', 'name':{'A':'1', 'B':'1', 'C':'1', 'P', '1'}, 'severity': '0', 'comment': 'this is down'} 

如果可能的話,我想避免複雜的解析,因爲這些都很難維護。 此外,我不知道上面的字符串中的鍵或值的名稱/數量。我只知道格式。這不是JSON響應,這是文件中文本的一部分,我無法控制當前的格式。

+0

您將需要一個自定義的解析器的格式; 'name'中的'''與字符串中的其他逗號衝突。 –

+1

它看起來不像json,但是如果你對格式有任何控制,我確實建議使用json。 –

+0

@TomaszŁazarowicz你是對的,我在看字典:/ –

回答

0

這是另一個建議。

你爲什麼不把它轉換成字典符號。

E.g.在第一步中,將包含'='(和mybe沒有空格,我不知道)的':'和(逗號或輸入結束)之間的所有內容替換爲大括號中的'=' ':'。

在第二步中,將':'和(逗號或輸入結束)之間的所有內容都包含在'中,去除尾隨和前導空格。

最後,你把它全部包裝在大括號中。

我還是不相信,語法,雖然...也許幾千行後已成功處理...

1

僅供參考,這是不完整的解決方案..

如果是這樣的混凝土結構的輸入,並且將你的源代碼中的常數模式,可以區分逗號分隔令牌。

major: 11之間的差異,和name: A=1,B=1,C=1,P=1,是,有所述第一令牌,這使得從所述第二令牌的差後SPACE。因此,只需在第二個split方法中添加一個空格,就可以正確渲染字符串。

所以,代碼應該是這樣的:

dict(elem.split(':') for elem in myString.split(', ')) 

注重送分裂法。有一個空格和逗號...

關於JSON格式,它需要更多的工作,我猜。我現在不知道..

+2

我想說這樣解釋給定的例子是相當勇敢的。它看起來不像是誰發明了這個語法就清楚瞭解這個應該如何解析,否則語法會有所不同。那麼我們怎麼能得出這樣的結論呢? –

+0

正如在上面的評論中提到的,我不能依靠空白! – theAlse

0

至少,這正確地分析給定的例子...

import re 

def parse(s): 

    rx = r"""(?x) 
     (\w+) \s* : \s* 
     (
      (?: \w+ = \w+,)* 
      (?: \w+ = \w+) 
      | 
      (?: [^,]+) 
     ) 
    """ 

    r = {} 
    for key, val in re.findall(rx, s): 
     if '=' in val: 
      val = dict(x.split('=') for x in val.split(',')) 
     r[key] = val 
    return r 


myString = "major: 11, minor: 31, name: A=1,B=1,C=1,P=1, severity: 0, comment: this is down" 
print parse(myString)  
# {'comment': 'this is down', 'major': '11', 'name': {'A': '1', 'P': '1', 'C': '1', 'B': '1'}, 'minor': '31', 'severity': '0'}