
本文介绍如何利用 Python 的正则表达式(regex)精准定位并移除嵌套括号中最内层括号内相邻字母数字字符之间的空格,从而实现类似 "(1 2 3)" → "(123)" 的格式化效果,避免误删外层空格或破坏括号结构。
本文介绍如何利用 python 的正则表达式(regex)精准定位并移除嵌套括号中最内层括号内相邻字母数字字符之间的空格,从而实现类似 `"(1 2 3)" → "(123)"` 的格式化效果,避免误删外层空格或破坏括号结构。
在处理类 Lisp 或自定义 DSL 的嵌套括号结构(如 ; (Col1 Col2 (Col3 Col4 Col5) ))时,常需对最内层括号内的空格进行清洗——例如将 (1 2 3) 转为 (123),但不能影响外层结构(如 Col1 和 Col2 之间的空格应保留,除非明确要求全局处理)。直接使用贪婪匹配(如 \(.+\(([^()]*)\)\))虽能捕获内层内容,却无法精准定位“仅位于两个字母/数字之间的空格”。
推荐采用 “上下文感知替换”策略:结合正向先行断言((?=\w))和反向先行断言((?<=\w)),确保只匹配被字母或数字包围的空格:
import re text = "; (113 (1 2 3) )" # 匹配:前面是字母/数字,后面也是字母/数字的空格 pattern = r"(?<=\w) (?=\w)" result = re.sub(pattern, "", text) print(result) # 输出:; (113 (123) )
⚠️ 注意事项:
- 此模式会全局生效,若输入为 ; (Col1 Col2 (Col3 Col4 Col5) ),Col1 Col2 间的空格也会被移除(变为 Col1Col2)。如需仅作用于最内层括号,应先提取最内层子串再处理:
def remove_inner_spaces(s):
# 递归查找最内层括号(无嵌套的括号)
inner_pattern = r"\([^()]*\)"
# 替换最内层括号中的空格
def replace_func(match):
content = match.group(0)
cleaned = re.sub(r"(?<=\w) (?=\w)", "", content)
return cleaned
# 迭代替换,直到无变化(处理多层嵌套)
while re.search(inner_pattern, s):
s = re.sub(inner_pattern, replace_func, s)
return s
# 示例
s = "; (Col1 Col2 (Col3 Col4 (a b c) Col5) )"
print(remove_inner_spaces(s))
# 输出:; (Col1 Col2 (Col3Col4 (abc) Col5) )✅ 总结:
立即学习“Python免费学习笔记(深入)”;
- 单层需求 → 直接用 r"(?<=\w) (?=\w)" 高效安全;
- 多层嵌套且需精确作用域 → 先用 \([^()]*\) 提取最内层括号,再局部应用空格清理;
- 避免使用 .* 等贪婪匹配直接操作整个嵌套结构,易引发边界错误或过度替换。


















