Мне нужно избежать символа &
(амперсанд) в строке. Проблема заключается в том, что когда я string = string.replace ('&', '\&')
результат '\\&'
. Добавлена дополнительная обратная косая черта, чтобы избежать исходной обратной косой черты. Как удалить эту дополнительную обратную косую черту?
Добавление обратной косой черты без экранирования [Python]
Ответ 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)
\&