Подтвердить что ты не робот

Python заменяет одиночную обратную косую черту двойным обратным слэшем

В python я пытаюсь заменить одиночную обратную косую черту ( "\" ) двойным обратным слэшем ( "\" ). У меня есть следующий код:

directory = string.replace("C:\Users\Josh\Desktop\20130216", "\", "\\")

Однако это дает сообщение об ошибке, в котором говорится, что ему не нравится двойной обратный слэш. Может ли кто-нибудь помочь?

4b9b3361

Ответ 1

Не нужно использовать str.replace или string.replace здесь, просто преобразуйте эту строку в необработанную строку:

>>> strs = r"C:\Users\Josh\Desktop\20130216"
           ^
           |
       notice the 'r'

Ниже приведена версия repr указанной строки, поэтому вы видите \\ здесь. Но фактически фактическая строка содержит только '\' not \\.

>>> strs
'C:\\Users\\Josh\\Desktop\\20130216'

>>> s = r"f\o"
>>> s            #repr representation
'f\\o'
>>> len(s)   #length is 3, as there only one `'\'`
3

Но когда вы собираетесь распечатать эту строку, вы не получите '\\' на выходе.

>>> print strs
C:\Users\Josh\Desktop\20130216

Если вы хотите, чтобы строка отображала '\\' во время print, используйте str.replace:

>>> new_strs = strs.replace('\\','\\\\')
>>> print new_strs
C:\\Users\\Josh\\Desktop\\20130216

repr теперь будет отображаться \\\\:

>>> new_strs
'C:\\\\Users\\\\Josh\\\\Desktop\\\\20130216'

Ответ 2

Используйте escape-символы: "full\\path\\here", "\\" и "\\\\"

Ответ 3

Позвольте мне сделать это простым и понятным. Давайте используем модуль re в python, чтобы избежать специальных символов.

Python script:

import re
s = "C:\Users\Josh\Desktop"
print s
print re.escape(s)

Выход:

C:\Users\Josh\Desktop
C:\\Users\\Josh\\Desktop

Объяснение:

Теперь обратите внимание, что функция re.escape при экранировании специальных символов в данной строке позволяет добавить другую обратную косую черту перед каждой обратной косой чертой, и, наконец, результат приводит к двойной обратной косой черте, нужный результат.

Надеюсь, это поможет вам.

Ответ 4

В python \ (обратная косая черта) используется как escape-символ. Это означает, что в тех местах, где вы хотите вставить специальный символ (например, новую строку), вы должны использовать обратную косую черту и другой символ (\n для новой строки)

При использовании вашего примера вы заметите, что когда вы поместите "C:\Users\Josh\Desktop\20130216" в repl, вы получите "C:\\Users\\Josh\\Desktop\x8130216". Это связано с тем, что \2 имеет особое значение в укусе python. Если вы хотите указать \, тогда вам нужно поместить два \\ в вашу строку.

"C:\\Users\\Josh\\Desktop\\28130216"

Другой вариант - уведомить python о том, что все ваши жало не должны использовать \ в качестве escape-символа, предварительно ожидая жало с помощью r

r"C:\Users\Josh\Desktop\20130216"

Это "сырая" строка и очень полезна в ситуациях, когда вам нужно использовать множество обратных косых черт, например, при регулярных выражениях.

Если вы все же захотите заменить этот одиночный \ на \\, вы должны использовать:

directory = string.replace(r"C:\Users\Josh\Desktop\20130216", "\\", "\\\\")

Обратите внимание на, что я не использую r' в последних двух укусах выше. Это связано с тем, что, когда вы используете форму stings r', вы не можете завершить эту строку одним \

Почему исходные строковые литералы Python не заканчиваются одним обратным слэшем?

https://pythonconquerstheuniverse.wordpress.com/2008/06/04/gotcha-%E2%80%94-backslashes-are-escape-characters/

Ответ 5

Возможно, синтаксическая ошибка в вашем случае, вы можете изменить строку на:

directory = str(r"C:\Users\Josh\Desktop\20130216").replace('\\','\\\\')

который дает вам следующий результат:

C:\\Users\\Josh\\Desktop\\20130216

Ответ 6

Учитывая исходную строку, манипуляция с os.path может иметь больше смысла, но здесь есть строковое решение;

>>> s=r"C:\Users\Josh\Desktop\\20130216"
>>> '\\\\'.join(filter(bool, s.split('\\')))
'C:\\\\Users\\\\Josh\\\\Desktop\\\\20130216'

Обратите внимание, что split рассматривает \\ в исходной строке как разделительную пустую строку. Использование filter избавляется от этих пустых строк, поэтому join не будет удваивать уже удвоенные обратные слэши. К сожалению, если у вас есть 3 или более, они уменьшаются до удвоенной обратной косой черты, но я не думаю, что это вредит вам в выражении в виде окна.

Ответ 7

Обратная косая черта указывает на специальный escape-символ. Поэтому directory = path_to_directory.replace("\", "\\") заставляет Python думать, что первый аргумент для замены не заканчивался до стартовой цитаты второго аргумента, поскольку он понимал конечную цитату как escape-символ.

directory=path_to_directory.replace("\\","\\\\")

Ответ 8

Использование:

string.replace(r"C:\Users\Josh\Desktop\20130216", "\\", "\\")

Побег над символом \.