在多个文件中查找替换并添加递增数字

0 投票
1 回答
1018 浏览
提问于 2025-04-18 16:12

我想在我电脑上的很多.cpp文件中替换一个正则表达式的模式。我需要在每次替换的末尾加上一个递增的数字,所以我选择用Python来完成这个任务。

我已经写了一些代码,但还没有成功:

import os
import re
i = 0
for file in os.listdir("C:\SeparatorTest"):
    if file.endswith(".cpp"):
        for line in open(file):
            line = re.sub(r'([^\s]*)\.Separator\((.*)\)\;', r'Separator \1\_' + i += 1 + '(\1,\2);')

我是不是漏掉了什么?

1 个回答

1

我没有测试过,因为我没想到你想替换的内容,但在你的re.sub调用中间不应该那样增加数字,你需要把最后一行代码替换成这个:

line = re.sub(r'([^\s]*)\.Separator\((.*)\)\;', r'Separator \1\_' + i + '(\1,\2);')
i += 1

在C++中,你可以直接写i++或++i,这样表达式会在增加前或增加后被计算,但在这里我建议不要用复杂的写法,Python需要保持可读性,下一个看你代码的程序员可能猜不到你做了什么。而且在Python中没有++这个操作符。

编辑:你只是读取文件,open(file)的默认模式是"r",也就是读取模式,你并没有写入任何东西。如果你想写入,就需要用open(file, "w")。而且不仅要把re.sub()的返回值存储在一个变量中,还要把它写入文件。

编辑2:这是我正在做的项目,尚未完成,我会在找到解决办法后再编辑:

import os, re
i = 0
def replacement(i):
    i += 1
    return r'Separator \1\_' + str(i) + '(\1,\2);'

for file in os.listdir("."):
    if file.endswith(".cpp"):
        for line in open(file):
            re.sub(r'([^\s]*)\.Separator\((.*)\)\;', replacement(i), line)

这个想法是替换的文本可以是一个函数的结果,这个函数应该在匹配到不重叠的模式时才被调用,具体可以参考Python文档

编辑3:我想我就到这里了,除非你给我回复,因为我还有一些正则表达式和其他问题没有时间去解决。而且我对文本替换的最佳实践也不太确定,你应该去查一下,应该会有帮助。把所有的部分结合起来(增加数字、修正你的re.sub()调用、以写入模式打开文件、替换匹配的文本),你应该能实现你想做的事情。

撰写回答