如何基于空格与()分割字符串?避免括号内内容被拆分
解决按空格分割但保留括号内完整内容的问题
你遇到的是典型的带上下文依赖的字符串分割需求——普通的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
相关产品推荐
相关产品推荐

