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

Python含嵌套括号的字符串分割:按规则拆分且保留子括号

Python 嵌套括号字符串拆分方案

给定字符串:

string_example = '11 31 (31 573) ((11 573)<(31 573 [1 0 0])<(11 31))'

需要实现以空格和括号为分隔符,但不拆分嵌套子括号的拆分,最终得到:

list_split=['11', '31', '(31 573)', '((11 573)<(31 573 [1 0 0])<(11 31))']

实现思路

用计数器跟踪括号嵌套深度,遍历字符串时区分「括号内」和「括号外」的处理逻辑:

  • 括号外的空格作为分隔符,分割独立元素
  • 括号内的所有字符(包括空格、嵌套括号)都保留为一个完整片段

代码实现

def split_with_nested_parens(s):
    result = []
    current = []
    paren_depth = 0
    
    for char in s:
        if char == '(':
            paren_depth += 1
            current.append(char)
        elif char == ')':
            paren_depth -= 1
            current.append(char)
            # 括号闭合且回到最外层时,存入当前片段
            if paren_depth == 0:
                result.append(''.join(current))
                current = []
        elif char == ' ':
            # 不在括号内时,空格作为分隔符
            if paren_depth == 0:
                if current:
                    result.append(''.join(current))
                    current = []
            # 在括号内时,空格保留
            else:
                current.append(char)
        else:
            current.append(char)
    # 处理最后一段非括号结尾的内容
    if current:
        result.append(''.join(current))
    return result

# 测试
string_example = '11 31 (31 573) ((11 573)<(31 573 [1 0 0])<(11 31))'
list_split = split_with_nested_parens(string_example)
print(list_split)
# 输出: ['11', '31', '(31 573)', '((11 573)<(31 573 [1 0 0])<(11 31))']

代码说明

  • paren_depth:记录当前括号嵌套层级,遇到(加1,)减1
  • 遍历每个字符时,只有当paren_depth为0(最外层)的空格才会触发分割操作
  • 括号内的所有字符(包括嵌套括号、空格)都会被收集到current中,直到最外层括号闭合,才将整个片段存入结果列表
  • 遍历结束后,检查是否有未处理完的current片段(比如字符串末尾不是括号的情况),确保不遗漏元素

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 04:17:33