Python中如何从字符串格式的对象列表中提取name键的值
问题原因分析
你两种方案失败的原因如下:
- 正则匹配失败:你使用的正则
r"'name': \D{1,}"中\D代表匹配非数字字符,且没有匹配到闭合的单引号,也没有设置分组单独提取name的取值,最终只能得到不完整的匹配结果。 - json.loads解析失败:JSON标准规范要求键和字符串值必须用双引号包裹,你要解析的字符串里用的是单引号,不符合JSON格式要求,所以抛出解析错误。
可行解决方案
方法1:转换格式后解析(推荐,稳定性更高)
方案a:替换单引号后用json解析
如果确认字符串内容里没有额外的单引号,可以直接替换单引号为双引号后再解析:
import json text = "[{'id': 53, 'name': 'Thriller'}, {'id': 18, 'name': 'Drama'}]" # 把单引号替换为符合JSON规范的双引号 json_text = text.replace("'", '"') data = json.loads(json_text) # 提取所有name值 name_list = [item['name'] for item in data] print(name_list) # 输出结果:['Thriller', 'Drama']
方案b:用ast.literal_eval解析(兼容性更强)
如果内容里可能存在单引号嵌套的情况,用Python自带的ast模块的literal_eval方法,它原生支持解析Python风格的单引号数组/字典字符串:
import ast text = "[{'id': 53, 'name': 'Thriller'}, {'id': 18, 'name': 'Drama'}]" data = ast.literal_eval(text) name_list = [item['name'] for item in data]
方法2:修正正则表达式实现提取
调整正则规则,通过捕获组提取单引号包裹的name取值:
import re text = "[{'id': 53, 'name': 'Thriller'}, {'id': 18, 'name': 'Drama'}]" name_list = re.findall(r"'name': '([^']+)'", text) print(name_list) # 输出结果:['Thriller', 'Drama']
正则说明:([^']+)是捕获组,匹配所有非单引号的字符,恰好可以拿到单引号包裹的name取值。
内容的提问来源于stack exchange,提问作者TrexCodes
相关产品推荐
相关产品推荐

