使用Python正则表达式解析无嵌套简单字典的方法求助
从无嵌套简单字典字符串提取键值对的正则方案
针对你这种无嵌套、仅含简单元组的字典字符串,不用复杂通用解析,用正则就能精准提取。核心是避免用贪婪的.*,而是针对键和值的具体格式写匹配规则:
完整代码示例
import re def extract_dict_pairs(dict_str): # 先去掉首尾的大括号 cleaned = dict_str.strip('{}') # 正则规则:匹配键值对,兼容空格、逗号分隔的写法 # 键:单引号包裹的内容,无嵌套引号 # 值:覆盖布尔值、数字、单引号字符串、无嵌套元组 pattern = r"'([^']+)'\s*:\s*(True|False|\d+|'[^']+'|\([^)]+\))" # 提取所有匹配的键值对 pairs = re.findall(pattern, cleaned) # 扁平化结果为目标列表格式 result = [] for key, value in pairs: result.append(key) # 可选:把值转成原生Python类型 if value.startswith("'") and value.endswith("'"): result.append(value.strip("'")) elif value in ("True", "False"): result.append(value == "True") elif value.isdigit(): result.append(int(value)) else: # 元组可保留字符串格式,或用eval转成实际元组(仅信任输入时用) result.append(value) return result # 测试示例 d1 = "{'a':10,'b':True,'c':(5,'a')}" print(extract_dict_pairs(d1)) # ['a', 10, 'b', True, 'c', '(5,\'a\')'] d2 = "{'c':(5,'a'), 'd': 'TX'}" print(extract_dict_pairs(d2)) # ['c', '(5,\'a\')', 'd', 'TX']
正则规则说明
'([^']+)':匹配单引号包裹的键,[^']+表示匹配除单引号外的所有字符,避免贪婪匹配到后续内容。\s*:\s*:匹配冒号前后的任意空格(包括零个),兼容带空格和不带空格的写法。True|False|\d+|'[^']+'|\([^)]+\):覆盖所有可能的值类型:True|False:匹配布尔值\d+:匹配整数(需支持浮点数可改成\d+\.?\d*)'[^']+':匹配单引号字符串\([^)]+\):匹配无嵌套元组,捕获从(到)的完整内容
更健壮的替代方案
如果后续需求扩展,建议用ast.literal_eval直接将字符串转成真实字典,比正则更安全可靠:
import ast d = "{'a':10,'b':True,'c':(5,'a')}" actual_dict = ast.literal_eval(d) # 转成目标列表格式 result = [] for k, v in actual_dict.items(): result.append(k) result.append(v) print(result) # ['a', 10, 'b', True, 'c', (5, 'a')]
内容的提问来源于stack exchange,提问作者dallascow
相关产品推荐
相关产品推荐

