2014-06-18 40 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