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

如何基于空格与()分割字符串?避免括号内内容被拆分

解决按空格分割但保留括号内完整内容的问题

你遇到的是典型的带上下文依赖的字符串分割需求——普通的str.split()只会无脑按空格拆分,没法识别括号这种成对的边界,所以得用更针对性的方法。下面给你两个实用的解决方案:

方案一:正则表达式(适合非嵌套括号场景)

如果你的需求里不会出现嵌套括号(比如(a (b) c)这种情况),正则表达式是最简洁高效的选择。我们可以匹配两种模式:完整的括号包裹内容,以及括号外的连续非空格字符。

实现代码

import re

input_str = "if condition or (condition-1 or condition-2) then print"
tokens = re.findall(r'\([^()]+\)|\S+', input_str)
print(tokens)

输出结果

['if', 'condition', 'or', '(condition-1 or condition-2)', 'then', 'print']

正则说明

  • \([^()]+\):匹配从(开始到)结束的完整内容,[^()]+确保中间不会出现其他括号(避免误匹配嵌套场景)
  • |:逻辑“或”,匹配两种模式中的任意一种
  • \S+:匹配连续的非空格字符,也就是括号外的单个独立 token

方案二:手动遍历字符串(支持嵌套括号)

如果你的场景需要处理嵌套括号(比如(a or (b and c) d)),正则表达式就力不从心了,这时候手动遍历字符串是更可靠的方式。我们通过维护一个括号计数器来判断当前是否处于括号内部,从而决定是否分割空格。

实现代码

input_str = "if condition or (condition-1 or (sub-condition) and condition-2) then print"
result = []
current_token = []
bracket_depth = 0

for char in input_str:
    if char == ' ':
        if bracket_depth == 0:
            # 处于括号外,遇到空格就分割当前token
            if current_token:
                result.append(''.join(current_token))
                current_token = []
        else:
            # 处于括号内,空格作为内容保留
            current_token.append(char)
    elif char == '(':
        bracket_depth += 1
        current_token.append(char)
    elif char == ')':
        bracket_depth -= 1
        current_token.append(char)
    else:
        current_token.append(char)

# 别忘了加入最后一个未分割的token
if current_token:
    result.append(''.join(current_token))

print(result)

输出结果

['if', 'condition', 'or', '(condition-1 or (sub-condition) and condition-2)', 'then', 'print']

逻辑说明

  • 用bracket_depth记录当前括号的嵌套深度:遇到(加1,遇到)减1
  • 当bracket_depth为0时,遇到空格就分割当前收集的token;不为0时,空格被当作普通字符加入当前token
  • 遍历结束后,把最后一个未处理的token加入结果列表

总结

  • 无嵌套括号:优先用正则方案,代码简洁高效
  • 有嵌套括号:用手动遍历方案,兼容性更强

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:24:04