应仅统一==、>=、=1.4.2, ==1.*),直接替换为==会导致部署失败;含空格或复杂结构的依赖需手动处理。

为什么 ^s*([a-zA-Z0-9._-]+)s*(?:==|>=|| 能匹配大部分 Python 依赖行
Sublime 的正则引擎(PCRE)默认不支持 ^/$ 跨行匹配,但开启「Match across lines」后,^ 和 $ 就能精准锚定每行首尾——这是整理 requirements.txt 类文件的前提。这个表达式专为常见 pip 依赖格式设计:requests==2.28.1、Django>=4.2.0rc1、pydantic 都能捕获,其中第二组 <code>([d.]+[a-zd]?) 允许结尾带预发布标识(如 rc、a1、b2),避免漏掉 numpy-1.24.0b1 这类写法。
- 不匹配
# comment或空行:靠^s*和行尾锚定自然跳过 - 不捕获
git+https://...或-e git://:它们不含==等版本运算符,不会误伤 - 若项目用 PEP 508 格式(如
requests [security] >= 2.28),需额外加非捕获组处理方括号,否则第二组会截断
替换时用 == 统一版本符号,但要注意 ~= 语义不能简单等价
~= 是兼容性版本运算符(如 ~=1.4.2 等价于 >=1.4.2, ==1.*),直接替成 == 会丢失语义、导致部署失败。真正安全的做法是只统一 ==、>=、、<code>、<code>>、!=,把 ~= 单独保留或人工确认。
- 安全替换表达式(Find):
^s*([a-zA-Z0-9._-]+)s*(==|>=|| - 对应替换(Replace):
==(强制转为==)或(仅清理空格) - 单独高亮
~=行:用 Find~=+ 「In Selection」快速定位,人工判断是否可降级为==
批量提取包名无版本,用 ^s*([a-zA-Z0-9._-]+)s*(?:[=!~].*)?$ 更可靠
单纯删掉 ==d.* 容易误删包名里的数字(如 python-dateutil 中的 dateutil 不含数字,但 pyyaml 没问题;而 aiobotocore 完全没数字)。用分组捕获包名本身最稳妥,且兼容带 extras 的写法(requests[security])。
- Find:
^s*([a-zA-Z0-9._-]+(?:[[^]]+])?)s*(?:[=!~].*)?$ - Replace:
- 注意:Sublime 默认不支持
?非贪婪,但此处[^]]+已限定范围,实际效果稳定
Windows 下路径含反斜杠时,\ 必须双写,否则正则报错
如果依赖列表里混着本地路径(如 ./libs/mylib 或 ../shared/pkg),而你在 Windows 上用 Sublime 打开,正则中出现单个 会被解释为转义符,导致 s 变成非法序列。必须写成 \s、\.、\w 才能通过语法校验。
- 错误写法:
^s*([a-zA-Z0-9._-]+)s*==s*([d.]+)s*$→ 在 Windows Sublime 中可能触发「Invalid regex」 - 正确写法:
^\s*([a-zA-Z0-9._-]+)\s*==\s*([\d.]+)\s*$ - 更省事:统一用正斜杠
/替代路径分隔符(pip 本身支持),避免反斜杠陷阱
真正麻烦的是嵌套 extras(pkg[extra1,extra2])和环境标记(; python_version >= "3.8"),这些没法靠一行正则安全处理——得先确认你的依赖列表里有没有这类结构,有就别硬上,手动分批更稳。











