Почему числа в строке становятся "x0n", когда им предшествует обратный слеш?
859 просмотра
2 ответа
Я провел несколько экспериментов с escape-слешами в оболочке Python 3.4 и заметил кое-что довольно странное.
>>> string = "\test\test\1\2\3"
>>> string
'\test\test\x01\x02\x03'
>>> string = "5"
>>> string
'5'
>>> string = "5\6\7"
>>> string
'5\x06\x07'
Как вы можете видеть в приведенном выше коде, я определил переменную строку как "\test\test\1\2\3"
. Тем не менее, когда я вошел string
в консоль, вместо печати "\test\test\1\2\3"
, он напечатал "\test\test\x01\x02\x03"
. Почему это происходит и для чего оно используется?
Ответы (2)
8 плюса
В строковых литералах Python \
символ запускает escape-последовательности. \n
переводит в символ новой строки, \t
в табуляцию и т. д. \xhh
шестнадцатеричные последовательности позволяют вместо этого создавать кодовые точки с шестнадцатеричными значениями, \uhhhh
создавать кодовые точки с 4-значными шестнадцатеричными значениями и \Uhhhhhhhh
создавать кодовые точки с 8-значными шестнадцатеричными значениями.
См. Документацию String и Bytes Literals , в которой содержится таблица всех возможных escape-последовательностей.
Когда Python отображает строковый объект в интерпретаторе (или вы используете repr()
функцию для строкового объекта), тогда Python создает представление строкового значения. Это представление использует тот же синтаксис строкового литерала Python, чтобы упростить отладку ваших значений, так как вы можете использовать представление для воссоздания одного и того же значения.
Чтобы непечатные символы не вызывали хаос или вообще не отображались, Python использует тот же синтаксис escape-последовательности для представления этих символов. Таким образом, байты, которые не могут быть напечатаны, представлены с использованием подходящих \xhh
последовательностей или, если возможно, одной из \c
однобуквенных букв (так что переводы строки отображаются как \n
)
В вашем примере вы создали непечатаемые байты, используя синтаксис escape-последовательности \ooo
восьмеричного значения . Цифры интерпретируются как восьмеричное число для создания соответствующей кодовой точки. Когда вы возвращаете это строковое значение обратно, используется \xhh
синтаксис по умолчанию для представления точно такого же значения в шестнадцатеричном виде:
>>> '\20' # Octal for 16
'\x10'
в то время как ваш \t
стал символом табуляции :
>>> print('\test')
est
Обратите внимание, что там нет буквы t
; вместо этого оставшийся est
отступ с помощью пробела, горизонтальной табуляции.
Если вам нужно включить буквенные \
символы обратной косой черты, вам нужно удвоить символ:
>>> '\\test\\1\\2\\3'
'\\test\\1\\2\\3'
>>> print('\\test\\1\\2\\3')
\test\1\2\3
>>> len('\\test\\1\\2\\3')
11
Обратите внимание, что в представлении используются двойные обратные слеши ! Если этого не произойдет, вы не сможете скопировать строку и вставить ее обратно в Python, чтобы воссоздать значение. Использование print()
для записи значения в терминал в виде фактических символов (а не в виде строкового представления) показывает, что в нем присутствуют одиночные обратные слэши, а если взять длину, то у нас в строке всего 11 символов, а не 15.
Вы также можете использовать необработанный строковый литерал. Это просто другой синтаксис, строковые объекты, созданные из синтаксиса, имеют точно такой же тип, с тем же значением. Это просто другой способ записи строковых значений. В необработанном строковом литерале обратная косая черта - это просто обратная косая черта, если она не является последним символом в строке; большинство escape-последовательностей не работают в необработанном строковом литерале:
>>> r'\test\1\2\3'
'\\test\\1\\2\\3'
И последнее , но не в последнюю очередь, если вы создаете строки, представляющие имена файлов на вашей системе Windows, вы можете также использовать вперед слэш; большинство API в Window не возражают и принимают оба типа слеша в качестве разделителей в имени файла:
>>> 'C:/This/is/a/valid/path'
'C:/This/is/a/valid/path'
Автор: Martijn Pieters
Размещён: 10.05.2015 01:59
2 плюса
Когда ты пишешь
string = "\test\test\1\2\3"
Python считает, что вы хотите определить строку символов, которая начинается с символа табуляции ("\ t"), затем символа "e", затем "s" и т. Д. Python также считает, что вы хотите включить некоторые непечатаемые символы, соответствующие литеральным числам 1, 2 и 3, которые обеспечивают сокращения «\ 1», «\ 2» и «\ 3».
Автор: hft Размещён: 10.05.2015 01:59Вопросы из категории :
- python Обработка XML в Python
- python Как я могу использовать Python itertools.groupby ()?
- python Python: На какой ОС я работаю?
- python Как я могу создать непосредственно исполняемое кроссплатформенное приложение с графическим интерфейсом на Python?
- python Вызов функции модуля с использованием его имени (строки)
- python Звук Питона («Колокол»)
- string В чем разница между строкой и строкой в ??C #?
- string Почему в Ruby нет реального StringBuffer или StringIO?
- string Преобразовать строку в перечисление в C #
- string Преобразование списка <Integer> в список <String>
- string Самый эффективный способ объединения строк?
- string Экранирование строк HTML с помощью jQuery
- python-3.x Могу ли я установить Python 3.x и 2.x на одном компьютере с Windows?
- python-3.x Что является альтернативой execfile в Python 3?
- python-3.x Каков наилучший способ удалить акценты в строке Unicode Python?
- python-3.x Удаление значка TK в окне Tkinter
- python-3.x Преобразовать байты в строку?
- python-3.x Синтаксическая ошибка при печати с Python 3