如何从含冒号的request.get返回文本构建Python字典?
解决含特殊字符的类JSON文本转字典问题
这问题我之前处理类似场景时也踩过坑!当字段值里包含冒号这种原本用来分隔键值的字符时,单纯用split(':')肯定会把值拆坏,导致构建字典失败。既然不能用json或urllib这类标准解析库,正则表达式绝对是最合适的替代方案,能精准定位键值对,避开值里的特殊字符。
具体实现方案
我们可以用正则匹配出每个键值对,规则专门针对你的返回文本结构设计:
- 匹配键:双引号包裹的字符串(键名)
- 匹配冒号:键和值之间的分隔符
- 匹配值:要么是双引号包裹的字符串(允许包含冒号、空格等),要么是数字(比如
year、id这类字段的值)
对应的正则表达式可以写成:
pattern = r'"([^"]+)":(?:(".*?")|(\d+))'
简单解释下这个正则:
"([^"]+)":精准捕获双引号内的键名,排除掉双引号本身:(?:(".*?")|(\d+)):匹配冒号后的值,用非捕获组区分两种情况:双引号包裹的字符串(非贪婪匹配避免跨键值匹配),或者纯数字
然后用这个正则提取所有键值对,再转换成字典:
完整代码示例
import re # 示例返回文本 response_text = u'[{"name":"File Name 1","year":2012,"id":991,"distance":0}]' # 先去掉外层的数组括号,取出第一个对象的内容 obj_text = response_text[1:-1] # 用正则匹配所有键值对 matches = re.findall(r'"([^"]+)":(?:(".*?")|(\d+))', obj_text) # 构建目标字典 result = {} for key, str_val, num_val in matches: if str_val: # 去掉值的首尾双引号 result[key] = str_val.strip('"') else: # 数字类型转成int result[key] = int(num_val) print(result) # 输出: {'name': 'File Name 1', 'year': 2012, 'id': 991, 'distance': 0}
测试第二个带冒号的name字段:
response_text = u'[{"name":"File Name 2: etc","year":2002,"id":773,"distance":0}]' # 同样处理后,result里的name字段会完整保留"File Name 2: etc"
扩展说明
如果后续你的返回文本出现其他类型的值(比如布尔值true/false),可以在正则的非捕获组里再加一个分支(true|false),然后对应处理布尔类型转换;如果遇到嵌套对象结构,可能需要调整正则或者用递归逻辑处理,但针对当前的扁平结构,这个方案完全够用。
内容的提问来源于stack exchange,提问作者just2c89
相关产品推荐
相关产品推荐

