使用正则保留中间字符串,批量为Python代码中所有a.b()调用追加.c()
问题根因
你之前的正则失效主要有两个原因:
- 默认正则的
.不匹配换行符,跨行的a.b()调用会匹配失败 - 非贪婪匹配
.*?遇到参数里嵌套的括号就会提前终止,比如a.b(D())会匹配到a.b(D()就结束,无法匹配到完整的括号对
可行方案
方案1:Python批量处理(最稳妥,适合全量代码文件修改)
依赖第三方regex库(支持递归匹配,可处理任意括号嵌套、换行缩进场景):
- 先安装依赖:
pip install regex
- 匹配正则:
r'a\.b(\((?:[^()]++|(?1))*\))'
- 替换规则:
r'a.b\1.c()'
- 完整批量处理脚本:
import regex import os # 替换为你的代码目录路径 CODE_ROOT = "./your_code_dir" # 只修改指定后缀的文件 FILE_SUFFIX = (".py",) for dirpath, _, filenames in os.walk(CODE_ROOT): for filename in filenames: if not filename.endswith(FILE_SUFFIX): continue file_path = os.path.join(dirpath, filename) with open(file_path, "r", encoding="utf-8") as f: content = f.read() # 执行替换 new_content = regex.sub( r'a\.b(\((?:[^()]++|(?1))*\))', r'a.b\1.c()', content ) # 仅当内容有变化时写回 if new_content != content: with open(file_path, "w", encoding="utf-8") as f: f.write(new_content) print(f"已更新文件:{file_path}")
方案2:编辑器手动替换(适合小范围修改)
如果用VSCode、Sublime等支持PCRE2正则的编辑器,可直接用搜索替换功能:
- 开启正则匹配模式+跨行匹配模式
- 搜索正则:
a\.b(\((?:[^()]|(?1))*\))
- 替换内容:
a.b$1.c()
优化提示
如果要避免对已经追加过.c()的代码重复替换,可以把匹配正则修改为:
r'a\.b(\((?:[^()]++|(?1))*\))(?!\.c\()`
增加负向零宽断言排除已修改的内容。
内容的提问来源于stack exchange,提问作者alwaysAStudent
相关产品推荐
相关产品推荐

