You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 08:45:30