在不更改数据类型的情况下删除两个字符之间的文本

时间:2018-08-20 02:41:35

标签: python

我有一个包含一些html的字典列表。删除<>之间的字符似乎可以满足我的要求。但是,我正在使用clean_data = re.sub(r'<.*?>', '', str(data))将其字典列表转换为字符串。我需要保留字典结构列表,以便进行一些后续工作,这些工作需要使用索引,键等来过滤字典列表。

如何在保留字典的现有数据结构的同时,删除<>之间(包括)之间的所有字符。

2 个答案:

答案 0 :(得分:3)

尝试:

import re
d={'a':'a<11>gg','b':'dq<ss>ss'}
print({k:re.sub(r'<.*?>','',v) for k,v in d.items()})

输出:

{'a': 'agg', 'b': 'dqss'}

要获取字典列表,请执行以下操作:

import re
lod=[{'a':'a<11>gg','b':'dq<ss>ss'},{'1':'12<aa>11','2':'aa<11>11'}]
print([{k:re.sub(r'<.*?>','',v) for k,v in d.items()} for d in lod])

答案 1 :(得分:0)

一种更通用的解决方案是递归地遍历给定的数据结构并对不同的数据类型做出不同的反应,以使其适用于由字典和/或字符串列表组成的任何嵌套数据结构:

import re
def recursive_replace(data, regex, repl, *args, **kwargs):
    if isinstance(data, dict):
        for k, v in data.items():
            data[k] = recursive_replace(v, regex, repl, *args, **kwargs)
    elif isinstance(data, list):
        for i, v in enumerate(data):
            data[i] = recursive_replace(v, regex, repl, *args, **kwargs)
    else:
        data = re.sub(regex, repl, data, *args, **kwargs)
    return data

这样:

print(recursive_replace([{'a':'a<11>gg','b':'dq<ss>ss'},{'1':'12<aa>11','2':'aa<11>11'}], r'<.*?>', ''))
print(recursive_replace({'a':['a<11>gg','dq<ss>ss'],'b':['12<aa>11','aa<11>11']}, r'<.*?>', ''))
would output:

[{'a': 'agg', 'b': 'dqss'}, {'1': '1211', '2': 'aa11'}]
{'a': ['agg', 'dqss'], 'b': ['1211', 'aa11']}