Python 3:我怎样才能让os.getcwd()与re.sub()一起玩得很好?

时间:2013-01-15 11:26:59

标签: python regex python-3.x

我正在尝试使用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')可能是答案,但事实并非如此。有人可以帮帮我吗?

我希望有一个解决方案不是“用'\'替换每个'\\'”。

1 个答案:

答案 0 :(得分: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