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

Добавление обратной косой черты без экранирования [Python]

Мне нужно избежать символа & (амперсанд) в строке. Проблема заключается в том, что когда я string = string.replace ('&', '\&') результат '\\&'. Добавлена ​​дополнительная обратная косая черта, чтобы избежать исходной обратной косой черты. Как удалить эту дополнительную обратную косую черту?

4b9b3361

Ответ 1

Результат '\\&' отображается только - на самом деле строка \&:

>>> str = '&'
>>> new_str = str.replace('&', '\&')
>>> new_str
'\\&'
>>> print new_str
\&

Попробуйте в оболочке.

Ответ 2

Дополнительная обратная косая черта фактически не добавляется; он просто добавляется функцией repr(), чтобы указать, что это буквальная обратная косая черта. Интерпретатор Python использует функцию repr() (которая вызывает __repr__() объекта), когда результат выражения должен быть напечатан:

>>> '\\'
'\\'
>>> print '\\'
\
>>> print '\\'.__repr__()
'\\'

Ответ 3

Python обрабатывает \ в литеральной строке особым образом.
Это значит, что вы можете набрать '\n' для обозначения новой строки или '\t' для обозначения вкладки Поскольку '\&' не означает ничего особенного для Python, вместо того, чтобы вызывать ошибку, лексический анализатор Python неявно добавляет вам дополнительный \.

Действительно, лучше использовать \\& или r'\&' вместо '\&'

r здесь означает необработанную строку и означает, что \ не обрабатывается специально, если только он не находится перед символом кавычки в начале строки.

В интерактивной консоли Python использует repr для отображения результата, поэтому вы видите двойную '\'. Если вы print свою строку или используете len(string), вы увидите, что это действительно только 2 символа

Некоторые примеры

>>> 'Here\ a backslash: \\'
"Here a backslash: \\"
>>> print 'Here\ a backslash: \\'
Here a backslash: \
>>> 'Here\ a backslash: \\. Here\ a double quote: ".'
'Here\ a backslash: \\. Here\ a double quote: ".'
>>> print 'Here\ a backslash: \\. Here\ a double quote: ".'
Here a backslash: \. Here a double quote ".

Чтобы уточнить точку, которую Питер делает в своем комментарии, см. эта ссылка

В отличие от стандарта C, все непризнанные escape-последовательности остаются в строка неизменной, то есть обратная косая черта остается в строке. (Это поведение полезно при отладке: если выход последовательность ошибочна, в результате выход легче распознается как сломан.) Также важно отметить что escape-последовательности, отмеченные как "(Только для Unicode)" в таблице выше попадают в категорию непризнанных escapes для строки, отличной от Unicode литералы.

Ответ 4

>>> '\\&' == '\&'
True
>>> len('\\&')
2
>>> print('\\&')
\&

Или другими словами: '\\&' содержит только одну обратную косую черту. Для ясности это просто выходило из вывода оболочки python.

Ответ 5

Нет дополнительной обратной косой черты, она просто отформатирована таким образом в интерактивной среде. Попробуйте:

print string

Затем вы можете увидеть, что на самом деле нет дополнительной обратной косой черты.

Ответ 6

Печать списка также может вызвать эту проблему (im new в python, так что это тоже смутило меня):

>>>myList = ['\\']
>>>print myList
['\\']
>>>print ''.join(myList)
\ 

аналогично:

>>>myList = ['\&']
>>>print myList
['\\&']
>>>print ''.join(myList)
\&