如何从含内部双引号的Python字符串中提取字典?
解决方法
针对这种值内包含未转义双引号的JSON格式字符串,我们可以通过正则表达式精准替换值内部的双引号为单引号,再进行解析。以下是具体实现步骤:
步骤1:处理字符串,替换值内的双引号
使用正则表达式匹配并替换值部分的内部双引号,保留键的双引号以及值的首尾双引号:
import re from ast import literal_eval # 原动态生成的字符串 text = ''' { "key1": "this is "value1" right", "key2": "this is "value2" right" } ''' # 正则替换值内部的双引号为单引号 # 匹配规则:排除键的引号(后接冒号)和值的首尾引号(前接冒号/空格、后接逗号/大括号) processed_text = re.sub(r'(?<![:\s])"(?![:\s,}])', "'", text)
步骤2:解析为字典
处理后的字符串符合Python字典格式,使用literal_eval即可安全解析:
result = literal_eval(processed_text) print(result) # 输出:{'key1': "this is 'value1' right", 'key2': "this is 'value2' right"}
说明
- 正则表达式
(?<![:\s])"(?![:\s,}])的作用:(?<![:\s]):正向否定预查,确保双引号前不是冒号或空格(排除键的结尾引号和值的开头引号)(?![:\s,}]):负向肯定预查,确保双引号后不是冒号、空格、逗号或大括号(排除键的开头引号和值的结尾引号)
- 使用
literal_eval而非json.loads是因为替换后的字符串使用单引号包裹值内的内容,json.loads仅支持双引号格式的JSON,而literal_eval可以解析合法的Python字典结构。
内容的提问来源于stack exchange,提问作者Rewan Gautam
相关产品推荐
相关产品推荐

