^\s* 不能直接替换为四个空格,否则会破坏原有缩进层级;应匹配“缩进不足4空格倍数”的行并仅补足差额,避免 indentationerror。

为什么 ^\s* 不能直接替换为四个空格
因为这样会把所有行首空白(包括已有缩进)全抹掉再补四个空格,导致原本 2 层缩进的代码变成 1 层,嵌套逻辑直接错乱。真正要匹配的是「当前缩进不足 4 空格倍数」的行,并只补足差额。
典型错误现象:IndentationError: unindent does not match any outer indentation level 在 Python 中反复出现,说明缩进不统一,不是全用空格、就是 Tab 和空格混用,或者层级跳变。
- 先用
View → Indentation → Convert Indentation to Spaces统一为空格(避免 Tab 干扰) - 再确认当前缩进基准:菜单
View → Indentation → Indentation Level,设为4 - 打开正则替换(
Ctrl+H,勾选.*按钮)
匹配「需要补缩进」的行:用 ^((?: {4})*)\s+(?=\S)
这个模式专抓「当前缩进是 4 空格的整数倍,但后面还跟了多余空白(比如 1–3 个空格),且其后是非空白字符」的行——也就是缩进「不够整」的脏数据。
说明:(?: {4})* 匹配 0/4/8/12… 个空格;\s+ 匹配后面多余的 1–3 个空格或制表符;(?=\S) 确保这些空白真正在代码前,而非空行或注释前。
- 替换为:
$1($1是原整数倍缩进,后面硬加 4 个空格) - 慎用全局替换:先
Find All看是否只命中目标行,尤其避开字符串字面量和注释内的空格 - 对齐失败常见于多行字符串或 docstring,建议先折叠相关区域再操作
修复混用 Tab 和空格的根源问题
Sublime 默认可能把 Tab 当作 4 字符宽显示,但实际存储仍是 \t 字符,Python 解释器却严格按字节判缩进,导致视觉对齐但运行报错。
- 检查当前文件是否含 Tab:开启
View → Whitespaces → Show Whitespaces,Tab 显示为→,空格为小圆点 - 批量转空格:正则查找
\t,替换为(4 个空格),但注意别误换字符串里的\t(可先禁用Match Inside Strings) - 一劳永逸:在用户设置里加
"translate_tabs_to_spaces": true,并确保"detect_indentation": false防止被文件污染
Python 中 if/for/def 块缩进批量对齐的边界情况
函数体、条件分支、循环体必须比上一行多一级缩进,但 Sublime 正则无法理解语法结构,只能靠缩进量推断。所以得先保证「上一行以 : 结尾」的行,下一行必须严格 +4。
- 安全做法:先用正则
^(\s*)(\S.*:)$找出所有冒号结尾行,再手动选中下一段代码块,用Ctrl+Shift+P → Indentation: Reindent Lines - 若要用正则自动补:查找
^(\s*)(\S.*:)\n(\s*)(?!\s{4})(\S),替换为$1$2\n$1 $4($1复用上层缩进,强制加 4 空格) - 注意
elif/else必须与if同级,不能套在if缩进内——这种逻辑错误正则修不了,得人眼核对
缩进修正不是纯机械操作,关键在识别「哪几行属于同一个逻辑块」。正则只是辅助工具,真正的层级关系还得靠代码语义判断,否则越修越乱。











