2014-06-18 75 views
0

我到現在在python以下的正則表達式:如何清空鍵在字典中與分字典

(\"[^"]+":\s)({}|\[\]|null)(,?\s?) 

我需要匹配「的一些關鍵」的所有實例:[]或{}或從字符串空,但我需要排除的情況下,「一些關鍵」是「注意」的情況下,字符串是:

test= {'merda 1': {}, 
     'merda 2': [1,2,3], 
     1: """"só pra fude""", 
     'Note': "foda-se", 
     'Não reclama': [], 
     'Tédio da nisso': OrderedDict({'Note': None, 1:2}), 
     'None':None, 
     'Quero $$$':(), 
     'Note': [], 
     12.2: None, 
     666: OrderedDict(), 
     'Fudeu': OrderedDict({1:None, 2:1, 3:2}) 
     } 

string_json = json.dumps(test) 

的目的是過濾字典的空葉子,但我需要請保留OrderedDicts。

解決方案:基於在馬丁回答

def clean_dict(dictobj): 
    """ Clean any number of empty leafs of a dictionary 
    """ 
    def del_empty_value(dictobj): 
     """ Delete empty values recursively 
     """ 
     for key, value in dictobj.items(): 
      if not (value or key == 'Note'): 
       del dictobj[key] 
      elif isinstance(value, dict): 
       del_empty_value(value) 
    from json import dumps 
    initial_hash = len(dumps(dictobj)) 
    while True: 
     del_empty_value(dictobj) 
     new_hash = len(dumps(dictobj)) 
     if new_hash == initial_hash: 
      break 
     initial_hash = new_hash 
+0

你的意思是一些文本「的_occurrences‘’_」 ?你想在示例字符串中匹配什麼? –

+0

當你用正則表達式匹配時,你想要移除它或保留它?這部分我不清楚。 –

+0

馬丁,我想刪除它。編輯清楚 – canesin

回答

2

爲什麼你不讓一個JSON解析器爲你做所有的辛勤工作?

import json 

s = '{"1": "\\"s\\u00f3 pra fude", "None": null, "Note": [], "N\\u00e3o reclama": [], "12.2": null, "666": {}, "merda 2": [1, 2, 3], "merda 1": {}, "T\\u00e9dio da nisso": {"Note": null}, "Fudeu": {"1": null, "2": 1, "3": 2}, "Quero $$$": []}' 

d = json.loads(s) 
result = dict((k, v) for k, v in d.iteritems() if not v or k == "Note") 

最後一行過濾掉任何鍵:值對,其中bool(v)False[]{}None都滿足這個條件),或者鍵值不是「注意」。

結果:

{u'12.2': None, 
u'666': {}, 
u'None': None, 
u'Note': [], 
u'N\xe3o reclama': [], 
u'Quero $$$': [], 
u'merda 1': {}} 

編輯:

由於作爲被更新的問題,有一個更好的答案:

test= {'merda 1': {}, 
    'merda 2': [1,2,3], 
    1: """"só pra fude""", 
    'Note': "foda-se", 
    'Não reclama': [], 
    'Tédio da nisso': OrderedDict({'Note': None, 1:2}), 
    'None':None, 
    'Quero $$$':(), 
    'Note': [], 
    12.2: None, 
    666: OrderedDict(), 
    'Fudeu': OrderedDict({1:None, 2:1, 3:2}) 
    } 

def delete_empty_value(test): 
    for k, v in test.items(): 
     if not (v or type(k) is OrderedDict or k == 'Note'): 
      del test[k] 
     elif isinstance(v, dict): 
      delete_empty_value(v) 

這個新的過濾器防止任何鍵:值對,其中:

  1. 價值不[]{}None
  2. 值是OrderedDict的實例
  3. 關鍵==「注意」
+0

這很好,但我有一個問題,有些項目OrderedDict,我改變了問題,以反映它 – canesin

+0

好的更新的答案。 –

+0

馬丁,我有過濾器不工作的subdictionaries(如'Tádioda nisso')..也許如果我遞歸做這個 – canesin