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
相关产品推荐
相关产品推荐

