python中的正则表达式删除太多

时间:2017-07-27 09:02:32

标签: python c++ regex

我正在尝试使用太干净的C ++文件进行Linux上的编译。具体来说,我正在尝试使用python脚本在#include语句中用斜杠'/'替换反斜杠'\'(我必须使用python)。 不幸的是,除了最后一个括号之外,脚本几乎删除了所有内容:

}

我正在使用这个脚本:

import os
import re
for dirpath, dirnames, filenames in os.walk(".\Source", topdown=True):
    for file in filenames:
        file = os.path.join(dirpath, file)
        tempfile = file + ".bak"
        with open(tempfile, "w") as target:
            with open(file) as source:
                for line in source:
                    if "#include" in line:
                        re.sub("\\\\", "/", line)
                target.write(line)
        os.remove(file)
        os.rename(tempfile, file)

编辑: 在实施Simon Fraser的建议之后,该脚本现在运行正常。它看起来像这样:

import os
import re
for dirpath, dirnames, filenames in os.walk(".\Source", topdown=True):
    for file in filenames:
        file = os.path.join(dirpath, file)
        tempfile = file + ".bak"
        with open(tempfile, "w") as target:
            with open(file) as source:
                for line in source:
                    if "#include" in line:
                        line = re.sub(r"\\", "/", line)
                    target.write(line)
        os.remove(file)
        os.rename(tempfile, file)

1 个答案:

答案 0 :(得分:2)

考虑这一部分:

for line in source:
    if "#include" in line:
        re.sub("\\\\", "/", line)
target.write(line)

for循环内,没有任何内容写入文件targetfor循环结束后,会写出line的最后一个值,这可能就是您输出中只有最后一个}的原因。

如果你在target.write循环中移动for,事情应该有效。 re.sub返回新值,而不是替换line,因此您也需要在那里进行变量赋值。

for line in source:
    if "#include" in line:
        line = re.sub("\\\\", "/", line)
    target.write(line)

字符串也有.replace方法,可能更快:

for line in source:
    if '#include' in line:
        line = line.replace('\\','/')
    target.write(line)