我正在尝试使用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')
可能是答案,但事实并非如此。有人可以帮帮我吗?
我希望有一个解决方案不是“用'\'
替换每个'\\'
”。
答案 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