С помощью этого кода я получаю:
newContent='asdf asdf \nOUTPUT_DIRECTORY = working\topOnly'
Я ожидаю, что это будет:
newContent='asdf asdf \nOUTPUT_DIRECTORY = working\\topOnly'
Регистр ex исключает a """\"""
между """working"""
и """topOnly"""
. Если я делаю что-то вроде """valStr = 'working\\ytopOnly'"""
, то он работает так, как ожидалось.
Что мне нужно изменить в моем коде, чтобы оно было таким, как ожидалось?
import re
valStr = 'working\\topOnly'
cmdFileContent = 'asdf asdf \nOUTPUT_DIRECTORY = asdf'
name = 'OUTPUT_DIRECTORY'
varRegEx = r"""
(\n #match new line
%s #var
\s* #skip white spaces
=
\s?) #skip white spaces
(.*) #match and store rest of line
"""%name
newContent = re.compile(varRegEx, re.VERBOSE).sub(r'\1%s'%valStr, cmdFileContent)
Справка для re.sub говорит:
repl может быть либо строкой, либо вызываемой; если строка, обратная косая черта в ней обрабатывается.
Так как он выполняет собственный слой обработки, вам понадобится еще один слой экранов:
newContent = re.compile(varRegEx, re.VERBOSE).sub(r'\1%s'%valStr.replace('\\', '\\\\'), cmdFileContent)
Не имеет никакого отношения к reg-exp. Попробуйте следующее:
valStr = 'working\\topOnly'
print valStr
Вы думаете, что print
тоже "отгоняет" вашу спину? Может быть, это заговор!
Это просто парсер Python. Как почти каждый парсер языка, он рассматривает обратную косую черту как побег, поэтому g\\t
означает g-backslash-t, тогда как g\t
означает "g-tab". Попробуйте
valStr = 'working\\\\topOnly'