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

如何提取嵌套括号字符串中的数据并输出为指定格式

嵌套括号字符串解析实现方案

你判断的没错,正则表达式无法可靠处理任意深度的嵌套括号匹配,这类场景用按括号匹配分块+递归解析的方案最稳定,不会出现层级匹配错误,后续调整规则也很方便。

规则对齐

从给出的样例可以梳理出核心解析逻辑:

  1. 字符串最开头的无括号前缀为根标识,单独作为第一行,行尾加逗号
  2. 每个结构单元格式为前缀(内容):
    • 如果内容里没有嵌套的其他括号结构,就把内容按下划线_拆成单个值,前缀后拼接TCH:,后面跟所有拆分后的值,值之间用逗号分隔,行尾加逗号
    • 如果内容里包含多个平级的前缀(子内容)结构,就每个子单元单独成行,前缀后加冒号,后面跟自己括号内拆分出的值,逗号分隔行尾加逗号

实现代码(Python)

def parse_block(prefix, content):
    lines = []
    blocks = []
    depth = 0
    current_pre = []
    current_block_content = []
    current_block_pre = ""
    idx = 0
    length = len(content)
    
    # 先按括号匹配把当前层的所有平级块切出来,不能直接用下划线分割,避免切到嵌套块内部
    while idx < length:
        char = content[idx]
        if char == "(":
            depth += 1
            if depth == 1:
                # 第一次碰到左括号,之前收集的字符就是当前块的前缀
                current_block_pre = "".join(current_pre).strip("_").strip()
                current_block_content = []
            else:
                current_block_content.append(char)
        elif char == ")":
            depth -= 1
            if depth == 0:
                # 回到当前层,一个完整块收集完成
                blocks.append((current_block_pre, "".join(current_block_content)))
                current_pre = []
                current_block_content = []
            else:
                current_block_content.append(char)
        elif char == "_" and depth == 0:
            # 平级块之间的下划线分隔符,直接跳过
            pass
        else:
            if depth == 0:
                current_pre.append(char)
            else:
                current_block_content.append(char)
        idx += 1
    
    # 判断当前块是不是叶子节点(内容无嵌套括号)
    is_leaf = all("(" not in bc and ")" not in bc for _, bc in blocks)
    if is_leaf and blocks:
        all_values = []
        for _, bc in blocks:
            all_values.extend([v for v in bc.split("_") if v])
        lines.append(f"{prefix}TCH: {', '.join(all_values)},")
    else:
        # 非叶子节点,递归处理每个子块
        for p, bc in blocks:
            lines.extend(parse_block(p, bc))
    return lines

def parse_target_string(s):
    # 提取最外层根标识
    root_end_pos = s.index("(")
    root_tag = s[:root_end_pos]
    # 根节点对应的内容是第一个左括号到最后一个右括号之间的部分
    root_content = s[root_end_pos+1:-1]
    result = [f"{root_tag},"]
    result.extend(parse_block("", root_content))
    return "\n".join(result)

# 测试用例
test_string = 'RGBA(30(25VARGHK_65FVDFKDGV_10FVDSSLBA)_10UJN(85VOEZSR_5VAVUSR_10SQMCFE)_20BBLRG(SSLCN)_10UDSCT(80EDYFIH_10VAP_10SNE)_30EDU(50EDFva_50VAP)_10EDP(50EDFva_50SNE))'
print(parse_target_string(test_string))

运行输出

执行上述代码会得到符合要求的结果,样例里写的5SQMCFE属于笔误,原字符串中对应值是10SQMCFE,实际输出如下:

RGBA,
30TCH: 25VARGHK, 65FVDFKDGV, 10FVDSSLBA,
10UJN: 85VOEZSR, 5VAVUSR, 10SQMCFE,
20BBLRG: SSLCN,
10UDSCT: 80EDYFIH, 10VAP, 10SNE,
30EDU: 50EDFva, 50VAP,
10EDP: 50EDFva, 50SNE,

如果后续有数值换算、特殊前缀处理的需求,直接在拆分值的逻辑里加对应判断即可,这个方案支持任意深度的括号嵌套,不会出现正则匹配的错位问题。

内容的提问来源于stack exchange,提问作者ReyManzarek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 11:09:13