Этот вопрос уже имеет ответ здесь:
Я должен выйти из a &
(амперсанд) символ в строке. Проблема состоит в том каждый раз, когда я string = string.replace ('&', '\&')
результат '\\&'
. Дополнительная обратная косая черта добавляется для выхода из исходной обратной косой черты. Как я удаляю эту дополнительную обратную косую черту?
Результат «\\ & '
отображается только - на самом деле строка \ &
:
>>> str = '&'
>>> new_str = str.replace('&', '\&')
>>> new_str
'\\&'
>>> print new_str
\&
Попробуйте в оболочке.
>>> '\\&' == '\&'
True
>>> len('\\&')
2
>>> print('\\&')
\&
или другими словами: '\\ &'
содержит только одну обратную косание. Он просто сбежал в выводе Python Shell для ясности.
Дополнительная обратная косая черта фактически не добавляется; он просто добавлен функцией repr ()
, чтобы указать, что это буквальная обратная косая черта. Интерпретатор Python использует функцию repr ()
(которая вызывает __ repr __ ()
для объекта), когда необходимо напечатать результат выражения:
>>> '\\'
'\\'
>>> print '\\'
\
>>> print '\\'.__repr__()
'\\'
Нет дополнительной обратной спинки, он просто отформатирован таким образом в интерактивной среде. Попробуйте:
print string
Тогда вы можете увидеть, что на самом деле нет дополнительной обратной спин.
Python особым образом обрабатывает \
в буквальной строке.
Это значит, что вы можете ввести '\ n'
для обозначения новой строки или '\ t'
для обозначения вкладки
Поскольку '\ &'
не означает ничего особенного для Python, вместо того, чтобы вызывать ошибку, лексический анализатор Python неявно добавляет за вас дополнительный \
.
На самом деле лучше использовать \\ &
или r '\ &'
вместо '\ &'
r
здесь означает необработанную строку и означает, что \
не обрабатывается специально, если только он не находится прямо перед символом кавычки в начале строки.
В интерактивной консоли Python использует repr
для отображения результата, поэтому вы видите двойное '\'. Если вы напечатаете
свою строку или используете len (строка)
, вы увидите, что на самом деле это только 2 символа.
Некоторые примеры
>>> 'Here\'s a backslash: \\'
"Here's a backslash: \\"
>>> print 'Here\'s a backslash: \\'
Here's a backslash: \
>>> 'Here\'s a backslash: \\. Here\'s a double quote: ".'
'Here\'s a backslash: \\. Here\'s a double quote: ".'
>>> print 'Here\'s a backslash: \\. Here\'s a double quote: ".'
Here's a backslash: \. Here's a double quote ".
Чтобы прояснить мысль, которую Питер делает в своей комментарий см. эту ссылку
В отличие от стандарта C, все нераспознанные escape-последовательности остаются в строке без изменений, т. е. в строке остается обратная косая черта . (Такое поведение полезно при отладке: если escape-последовательность введена с ошибкой, результирующий вывод легче распознать как неработающий.) Это также важно отметить , что escape-последовательности, помеченные как «(только Unicode)» в таблице выше , попадают в категорию нераспознанных escape-последовательностей для строк, отличных от Unicode литералы.