将包含转义字符的字符串转换为dict

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将包含转义字符的字符串转换为dict相关的知识,希望对你有一定的参考价值。

我需要将表示dict的python字符串转换为python dict。字符串可能包含任何有效的dict表示,包括windows样式pathes(带反斜杠),例如

mystring = u'{"baselocaldir":"c:\tmp\SrcTmp\RepManager"}'

我需要一个通用的str来转换函数,所以这只是一个源字符串的例子,它不起作用。源字符串可能来自外部源。 python 2/3兼容解决方案将是首选。

我已经尝试了给出的答案:

json.loads不起作用(即使我将字符串重新格式化为json语法):引发异常

ast.literal_eval不起作用:在此示例中,它在结果中放置制表符

eval:与ast.literal_eval相同的结果

答案

我会在字符串上添加一个hack来替换'c:'作为原始字符串文字r'c:'

mystring = u'{"baselocaldir": "c:\tmp\SrcTmp\RepManager"}'.replace('"c:', 'r"c:') 
_dict = eval(mystring)
_dict

结果:

{'baselocaldir': 'c:\tmp\SrcTmp\RepManager'}
另一答案

Edit3:在op将样本字符串更改为双反斜杠后,它更容易,不需要使用正则表达式:

mystring = u'{"baselocaldir":"c:\tmp\SrcTmp\RepManager"}'
test = repr(mystring)[1:-1] 
print(test)

# convert to dictionary
my_dict = json.loads(test)
print('dict key "baselocaldir" = ', my_dict["baselocaldir"])

输出:

{"baselocaldir":"c:\tmp\SrcTmp\RepManager"}
dict key "baselocaldir" =  c:	mpSrcTmpRepManager

Edit2:显然单独使用repr()是不够的,这就是为什么我编辑我的答案使用正则表达式并将所有替换为\,这里是代码:

import re, json
mystring = u'{"baselocaldir":"c:	mpSrcTmpRepManager"}'

test = re.sub(r'(?<=[^\])\(?=[^\])', r'\\', repr(mystring)[1:-1])
print(test)

# convert to dictionary
my_dict = json.loads(test)
print('dict key "baselocaldir" = ', my_dict["baselocaldir"])

输出:

{"baselocaldir":"c:\tmp\SrcTmp\RepManager"}
dict key "baselocaldir" =  c:	mpSrcTmpRepManager

以前的答案,这还不够编辑:将字符串转换为raw的简单方法是使用repr()"%r"

这是一个一步到位的解决方案,9年前,它归功于Nishanth Amuluru and Jed Alexander

mystring = u'{"baselocaldir":"c:	mpSrcTmpRepManager"}'

raw_str = "%r"%mystring
rep_str= repr(mystring)

print('original string = ', mystring)
print('Raw string = ', raw_str)
print('rep string = ', rep_str)

输出:

original string =  {"baselocaldir":"c:  mpSrcTmpRepManager"}
Raw string =  '{"baselocaldir":"c:	mp\SrcTmp\RepManager"}'
rep string =  '{"baselocaldir":"c:	mp\SrcTmp\RepManager"}'
另一答案

我的(也许不是最优雅的)解决方案:

但它适用于python2,python3以及unicode字符串中的unicode字符:


text_type = None
if PY2:
    string_types = basestring
    text_type = unicode
else:
    string_types = text_type = str

def DictUnescaceBackslash(oDict):
    for key, value in iteritems(oDict):
        if isinstance(value, dict):
            DictUnescaceBackslash(value)
        elif isinstance(value, string_types):
            oDict[key]=oDict[key].replace("***BaCkSlAsH***","\")
        elif isinstance(value, list):
           for elem in value:
                DictUnescaceBackslash(elem)

mystring = u'{"baselocaldir":"c:\tmp\SrcTmp\RepManager"}'
uString2 = mystring.replace("\","***BaCkSlAsH***")
dDict    = ast.literal_eval(uString2)
DictUnescaceBackslash(dDict)


以上是关于将包含转义字符的字符串转换为dict的主要内容,如果未能解决你的问题,请参考以下文章

如何转义通过用户输入收到的乳胶代码?

将文字反斜杠后跟一个字符转换为相应的转义序列

我可以将 C# 字符串值转换为转义字符串文字吗?

如何将 unicode 字符串转换为其 unicode 转义?

URL转义

python - 如何以python中的功能方式将字符串转换为分层数据结构中的dict?