1

我正在尝试使用当前工作目录替换文件中的某些内容python 3.3。我有:

def ReplaceInFile(filename, replaceRegEx, replaceWithRegEx):
    ''' Open a file and use a re.sub to replace content within it in place '''
    with fileinput.input(filename, inplace=True) as f:
        for line in f:
            line = re.sub(replaceRegEx, replaceWithRegEx, line)
            #sys.stdout.write (line)
            print(line, end='')

我像这样使用它:

ReplaceInFile(r'Path\To\File.iss', r'(#define RootDir\s+)(.+)', r'\g<1>' + os.getcwd())

对我来说不幸的是,我的路径是 C:\Tkbt\Launch,所以我得到的替换是:

#define RootDir C:  kbt\Launch

即它被解释\t为标签。

所以在我看来,我需要告诉 python 将所有内容从os.getcwd(). 我想也许.decode('unicode_escape')可能是答案,但事实并非如此。有人可以帮帮我吗?

我希望有一个不是“查找替换每个”的解决'\'方案'\\'

4

1 回答 1

2

.replace('\\', '\\\\')恐怕你不得不求助于,这是你完成这项工作的唯一选择。

  • 如果可行的话,使用编码unicode_escape然后再次从 ASCII 解码会很好:

    replacepattern = r'\g<1>' + os.getcwd().encode('unicode_escape').decode('ascii')
    

    这对路径做了正确的事情:

    >>> print(re.sub(r'(#define RootDir\s+)(.+)', r'\g<1>' + r'C:\Path\to\File.iss'.encode('unicode_escape').decode('ascii'), '#define Root
    #define RootDir C:\Path\to\File.iss
    

    但不适用于现有的非 ASCII 字符,因为re.sub()不处理\u\x转义。

  • 不要re.escape()用来转义字符串中的特殊字符,这会转义太多:

    >>> print(re.sub(r'(#define RootDir\s+)(.+)', r'\g<1>' + re.escape(r'C:\Path\To\File.iss'), '#define RootDir foo/bar/baz'))
    #define RootDir C\:\Path\To\File\.iss
    

    注意\:那里。

只会.replace()产生有效的替换模式,包括非 ASCII 字符:

>>> print(re.sub(r'(#define RootDir\s+)(.+)', r'\g<1>' + 'C:\\Path\\To\\File-with-non-
ASCII-\xef.iss'.replace('\\', '\\\\'), '#define Root
#define RootDir C:\Path\To\File-with-non-ASCII-ï.iss
于 2013-01-15T11:29:38.217 回答