应使用正则^\s*import\s+\w+(?!\s+as\s+\w+)(?!\s*,)匹配纯import语句,排除别名和多模块导入,配合白名单过滤第三方库、跳过__future__和typing、保留本地模块,并替换后用py_compile验证未定义变量。

匹配 import 语句但保留 from ... import ... 形式
Sublime 的正则替换容易误删 from requests import Session 这类合法导入,关键在区分「纯 import」和「from-import」。用 ^import\s+\w+ 只能抓到行首的 import,但会漏掉缩进后的、或带注释的;更稳妥的是:^\s*import\s+\w+(?!\s+as\s+\w+)(?!\s*,) —— 它用负向先行断言排除掉 import os as _os 和 import sys, os 这两种常见变体,避免误删别名或批量导入。
实际操作时先打开「Find → Find…」,勾选「Regular Expression」和「Whole Word」(可选),输入上述模式,确认只高亮了你要清理的单模块导入,比如:import json、import re,而跳过 from urllib.parse import urlparse 和 import numpy as np。
安全删除 import 但不碰 __future__ 和 typing 相关导入
第三方库清理常误伤 from __future__ import annotations 或 from typing import List, Optional —— 它们不是运行时依赖,但影响类型检查和语法兼容性。直接删掉会导致 mypy 报错或 Python 3.7+ 的 annotations 特性失效。
建议分两步处理:
- 先用
^from\s+(__future__|typing)\b搜索并跳过所有匹配行(Ctrl+Shift+G 跳转到下一处) - 再对剩余内容执行主清理:用
^\s*import\s+\w+(\s*,\s*\w+)*\s*(? 匹配无注释的纯 import 行(<code>(? 确保行末没注释,避免删掉 <code>import os # needed for path) - 替换为空(即删除整行),但务必开启「In Selection」模式,手动框选待清理区域,防止跨文件误操作
识别并保留项目本地模块导入
第三方库一般指 pip install 安装的包(如 requests、numpy),而 import utils、import core.models 是本地模块,不能一并清除。Sublime 本身不解析 import 依赖树,所以得靠命名特征辅助判断。
典型本地模块特征包括:
- 路径中含
./、../或相对导入语法(如from . import config)→ 正则可用^\s*from\s+\.\w*或^\s*import\s+\.\w+捕获,这类必须跳过 - 模块名全小写且无连字符(
import myapp) vs 第三方库常见带连字符或长名(import python-dotenv)→ 不可靠,仅作参考 - 最稳的方式是提前生成白名单:运行
pip freeze | cut -d'=' -f1 | sort导出已安装包名,粘贴进 Sublime 新建 tab,再用「Find All」逐个搜索import xxx,人工确认是否第三方
替换后检查循环导入和未声明变量
删掉 import os 后,如果代码里还有 os.path.join() 就会报 NameError: name 'os' is not defined;更隐蔽的是循环导入问题:A.py 删了 import B,但 B.py 仍 import A,而 A.py 中又用了 B 的某个函数——表面不报错,运行时可能卡死或 AttributeError。
验证建议:
- 保存后立即运行
python -m py_compile your_file.py,它能快速发现未定义名称,比等 IDE 提示更直接 - 对疑似有循环依赖的模块,临时加一句
print(__name__)在模块顶层,观察 import 顺序输出 - 如果项目用了 pytest,跑一次
pytest --import-mode=import,它比默认的importlib模式更容易暴露残留引用
真正麻烦的不是删多,而是删得“看起来干净”却留下隐性调用——尤其是那些被 IDE 自动补全塞进去、从没被执行过的 import。

















