Вопрос-Ответ

What exactly do "u" and "r" string prefixes do, and what are raw string literals?

Что именно делают строковые префиксы "u" и "r" и что такое необработанные строковые литералы?

Задавая этот вопрос, я понял, что мало что знаю о необработанных строках. Для человека, называющего себя тренером Django, это отстой.

Я знаю, что такое кодировка, и я знаю, что делает u'' alone, поскольку я получаю то, что называется Unicode.


  • Но что именно r'' делает? Какую строку это приводит?


  • И, прежде всего, что, черт возьми, делает ur''?


  • Наконец, есть ли какой-либо надежный способ вернуться от строки Unicode к простой необработанной строке?


  • Ах, и, кстати, если ваша система и кодировка вашего текстового редактора установлены в UTF-8, u'' на самом деле что-нибудь делает?


Переведено автоматически
Ответ 1

На самом деле никакой "необработанной строки" не существует; есть необработанные строковые литералы, которые в точности являются строковыми литералами, отмеченными 'r' перед открывающей кавычкой.

"Необработанный строковый литерал" - это немного другой синтаксис строкового литерала, в котором обратная косая черта, \ , принимается как означающая "просто обратную косую черту" (за исключением случаев, когда она стоит прямо перед кавычкой, которая в противном случае завершала бы литерал) - никаких "escape-последовательностей" для представления новых строк, табуляций, обратных пробелов, каналов формы и так далее. В обычных строковых литералах каждая обратная косая черта должна быть удвоена, чтобы ее не принимали за начало escape-последовательности.

Этот вариант синтаксиса существует в основном потому, что синтаксис шаблонов регулярных выражений изобилует обратными косыми чертами (но никогда в конце, поэтому предложение "except" выше не имеет значения), и он выглядит немного лучше, когда вы избегаете удвоения каждой из них - вот и все. Также приобрело некоторую популярность выражение собственных путей к файлам Windows (с обратной косой чертой вместо обычной, как на других платформах), но это требуется очень редко (поскольку обычные косые черты в основном отлично работают и в Windows) и несовершенно (из-за предложения "except" выше).

r'...' это байтовая строка (в Python 2. *), ur'...' это строка в Юникоде (опять же, в Python 2. *), и любой из трех других видов кавычек также создает точно такие же типы строк (так, например, r'...', r'''...''', r"...", r"""...""" все это байтовые строки и так далее).

Не уверен, что вы подразумеваете под "возвращением назад" - по сути, нет указаний назад и вперед, потому что нет необработанного строкового типа, это просто альтернативный синтаксис для выражения совершенно обычных строковых объектов, какими бы они ни были, в байтах или юникоде.

И да, в Python 2. *, u'...' это, конечно, всегда отличается от just '...' - первое представляет собой строку в юникоде, второе - строку в байтах. В какой кодировке может быть выражен литерал, является полностью ортогональной проблемой.

Например, рассмотрим (Python 2.6):

>>> sys.getsizeof('ciao')
28
>>> sys.getsizeof(u'ciao')
34

Объект Unicode, конечно, занимает больше места в памяти (очевидно, очень небольшая разница для очень короткой строки ;-).

Ответ 2

В Python 2 существует два типа строк: традиционный str тип и более новый unicode тип. Если вы вводите строковый литерал без u впереди, вы получаете старый str тип, который хранит 8-битные символы, а с u впереди вы получаете более новый unicode тип, который может хранить любой символ Юникода.

r Вообще не меняет тип, он просто меняет способ интерпретации строкового литерала. Без r обратная косая черта обрабатывается как escape-символы. С помощью r обратная косая черта обрабатывается как литерал. В любом случае, тип один и тот же.

ur это, конечно, строка в Юникоде, где обратные косые черты являются буквальными обратными косыми чертами, а не частью escape-кодов.

Вы можете попытаться преобразовать строку Unicode в старую строку с помощью str() функции, но если есть какие-либо символы unicode, которые не могут быть представлены в старой строке, вы получите исключение. При желании вы могли бы сначала заменить их вопросительными знаками, но, конечно, это сделало бы эти символы нечитаемыми. Не рекомендуется использовать тип str, если вы хотите правильно обрабатывать символы юникода.

Ответ 3

"необработанная строка" означает, что она хранится в том виде, в каком она появляется. Например, '\' это просто обратная косая черта вместо экранирующего.

Ответ 4

Позвольте мне объяснить это просто: в python 2 вы можете хранить string в двух разных типах.

Первый - это ASCII, который является типом str в python, он использует 1 байт памяти. (256 символов, будут храниться в основном английские алфавиты и простые символы)

Второй тип - это UNICODE, который является типом unicode в python. Unicode хранит все типы языков.

По умолчанию python предпочитает тип str, но если вы хотите сохранить строку в типе unicode, вы можете поместить u перед текстом, например, u'text' или вы можете сделать это, вызвав unicode ('text')

Итак, u - это просто короткий способ вызвать функцию для преобразования str в unicode. Вот и все!

Теперь часть r, вы помещаете ее перед текстом, чтобы сообщить компьютеру, что текст является необработанным текстом, обратная косая черта не должна быть экранирующим символом. r '\n' не создаст новый символ строки. Это просто обычный текст, содержащий 2 символа.

Если вы хотите преобразовать str в юникод, а также поместить туда необработанный текст, используйте ur, потому что ru выдаст сообщение об ошибке.

ТЕПЕРЬ важная часть:

Вы не можете сохранить одну обратную косую черту с помощью r, это единственное исключение. Таким образом, этот код выдаст ошибку: r'\'

Для хранения обратной косой черты (только одной) вам нужно использовать '\\'

Если вы хотите сохранить более 1 символа, вы все равно можете использовать r, например, r '\\' создаст 2 обратные косые черты, как вы и ожидали.

Я не знаю причину, по которой r не работает с одним хранилищем обратной косой черты, но причина пока никем не описана. Я надеюсь, что это ошибка.

2023-07-04 12:23 python unicode