Что именно делают строковые флаги "u" и "r" и что такое необработанные строковые литералы? - PullRequest
555 голосов
/ 17 января 2010

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

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

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

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

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

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

Ответы [ 6 ]

609 голосов
/ 17 января 2010

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

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

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

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

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

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

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

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

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

159 голосов
/ 17 января 2010

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

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

ur - это, конечно, строка Unicode, в которой обратные косые черты являются буквальными обратными косыми чертами, а не частью управляющих кодов.

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

53 голосов
/ 06 марта 2012

«необработанная строка» означает, что она сохраняется в том виде, в котором она появилась. Например, '\' - это просто обратная косая черта вместо с экранированием .

33 голосов
/ 17 января 2010

Префикс «u» обозначает, что значение имеет тип unicode вместо str.

Необработанные строковые литералы с префиксом "r" экранируют любые escape-последовательности внутри них, поэтому len(r"\n") равно 2. Поскольку они экранируют escape-последовательности, вы не можете завершить строковый литерал одной обратной косой чертой: это недопустимый escape последовательность (например, r"\").

«Raw» не является частью типа, это просто один из способов представления значения. Например, "\\n" и r"\n" являются идентичными значениями, так же как 32, 0x20 и 0b100000 являются идентичными.

У вас могут быть строковые литералы Unicode:

>>> u = ur"\n"
>>> print type(u), len(u)
<type 'unicode'> 2

Кодировка исходного файла просто определяет, как интерпретировать исходный файл, иначе не влияет на выражения или типы. Тем не менее, рекомендуется , чтобы избежать кода, в котором кодировка, отличная от ASCII, изменила бы значение:

В файлах, использующих ASCII (или UTF-8 для Python 3.0), не должно быть файла cookie для кодирования. Latin-1 (или UTF-8) следует использовать только тогда, когда в комментарии или строке документации необходимо указать имя автора, для которого требуется Latin-1; в противном случае использование \ x, \ u или \ U является предпочтительным способом включения не-ASCII-данных в строковые литералы.

26 голосов
/ 26 августа 2015

Позвольте мне объяснить это просто: В Python 2 вы можете хранить строки в 2 разных типах.

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

2-й тип - UNICODE , то есть тип unicode в python, он использует 2 байта памяти. (65536 символов, поэтому сюда входят все символы всех языков на земле)

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

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

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

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

СЕЙЧАС, важная часть:

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

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

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

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

4 голосов
/ 15 мая 2017

Может быть, это очевидно, а может и нет, но вы можете сделать строку '\' , вызвав x = chr (92)

x=chr(92)
print type(x), len(x) # <type 'str'> 1
y='\\'
print type(y), len(y) # <type 'str'> 1
x==y   # True
x is y # False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...