регулярное выражение Python удаляет обратную косую черту

1

С помощью этого кода я получаю:

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)
  • 0
    реальный и ожидаемый результат совпадают, пожалуйста, отредактируйте его.
Теги:

2 ответа

1
Лучший ответ

Справка для re.sub говорит:

repl может быть либо строкой, либо вызываемой; если строка, обратная косая черта в ней обрабатывается.

Так как он выполняет собственный слой обработки, вам понадобится еще один слой экранов:

newContent = re.compile(varRegEx, re.VERBOSE).sub(r'\1%s'%valStr.replace('\\', '\\\\'), cmdFileContent)
  • 0
    Это работает. Спасибо!!!!
0

Не имеет никакого отношения к reg-exp. Попробуйте следующее:

 valStr = 'working\\topOnly'
 print valStr

Вы думаете, что print тоже "отгоняет" вашу спину? Может быть, это заговор!

Это просто парсер Python. Как почти каждый парсер языка, он рассматривает обратную косую черту как побег, поэтому g\\t означает g-backslash-t, тогда как g\t означает "g-tab". Попробуйте

 valStr = 'working\\\\topOnly'
  • 0
    Моя IDE показывает версию строк repr. Му Разум решение работает. Спасибо за помощь

Ещё вопросы

Сообщество Overcoder
Наверх
Меню