如何为Python字典字符串的所有键和值添加单引号?
为无引号的字典字符串添加引号以转换为dict类型
问题描述
有如下格式的字典字符串:
s = "{0: {name: [(.1, 0), (.2, 0), (.3, 0)], address: [(get--some\\data, 0), (2, 0), (3, 0)]}}"
尝试用ast.literal_eval()、eval()或json.loads()将其转换为Python字典时,因字符串中键和部分值未加引号而失败。需要将所有键和值添加单引号,得到如下格式的字符串:
s = "{'0': {'name': [('.1', '0'), ('.2', '0'), ('.3', '0')], 'address': [('get--some\\data', '0'), ('2', '0'), ('3', '0')]}}"
已完成的尝试
已通过正则表达式为所有键添加了单引号,代码如下:
import re s = "{0: {name: [(.1, 0), (.2, 0), (.3, 0)], address: [(get--some\\data, 0), (2, 0), (3, 0)]}}" # 为键添加单引号 a = re.sub(r'((\w+)|(\w+\s*?\w+)):', r"'\1':", s)
为值添加引号的解决方案
在已处理键的基础上,可以通过正则表达式匹配列表、元组中的无引号值,为其添加单引号:
# 为值添加单引号 result = re.sub(r'([\(\[,]\s*)([^"\',\]\)]+?)(\s*[,)\]])', r"\1'\2'\3", a) print(result)
说明
- 正则表达式
([\(\[,]\s*)匹配元组/列表的起始符号((、[)及其后的空白字符; ([^"\',\]\)]+?)匹配无引号的目标值(排除引号、逗号、闭合符号);(\s*[,)\]])匹配值后的空白字符及分隔符/闭合符号;- 替换时将匹配到的目标值用单引号包裹,保留前后的符号和空白。
完整代码
import re s = "{0: {name: [(.1, 0), (.2, 0), (.3, 0)], address: [(get--some\\data, 0), (2, 0), (3, 0)]}}" # 处理键 a = re.sub(r'((\w+)|(\w+\s*?\w+)):', r"'\1':", s) # 处理值 result = re.sub(r'([\(\[,]\s*)([^"\',\]\)]+?)(\s*[,)\]])', r"\1'\2'\3", a) print(result) # 输出结果:{'0': {'name': [('.1', '0'), ('.2', '0'), ('.3', '0')], 'address': [('get--some\\data', '0'), ('2', '0'), ('3', '0')]}}
内容的提问来源于stack exchange,提问作者prem Rexx
相关产品推荐
相关产品推荐

