¿Qué hacen exactamente los prefijos de cadena "u" y "r" y qué son los literales de cadena sin formato?

Resuelto Bite code asked hace 14 años • 7 respuestas

Mientras hacía esta pregunta , me di cuenta de que no sabía mucho sobre cadenas sin formato. Para alguien que dice ser entrenador de Django, esto apesta.

Sé lo que es una codificación y sé lo que u''hace, ya que entiendo qué es Unicode.

  • ¿Pero qué hace r''exactamente? ¿Qué tipo de cuerda resulta?

  • Y sobre todo, ¿qué carajos hace ur''?

  • Finalmente, ¿existe alguna forma confiable de volver de una cadena Unicode a una cadena simple y sin formato?

  • Ah, y por cierto, si su sistema y el juego de caracteres de su editor de texto están configurados en UTF-8, ¿ u''realmente hace algo?

Bite code avatar Jan 17 '10 23:01 Bite code
Aceptado

Realmente no hay ninguna " cadena sin procesar "; hay literales de cadena sin formato , que son exactamente los literales de cadena marcados con una 'r'antes de la comilla inicial.

Un "literal de cadena sin formato" es una sintaxis ligeramente diferente para un literal de cadena, en el que una barra invertida, , \se entiende como "sólo una barra invertida" (excepto cuando aparece justo antes de una comilla que de otro modo terminaría el literal) - no "secuencias de escape" para representar líneas nuevas, tabulaciones, retrocesos, avances de formulario, etc. En los literales de cadena normales, cada barra invertida debe duplicarse para evitar que se tome como el inicio de una secuencia de escape.

Esta variante de sintaxis existe principalmente porque la sintaxis de los patrones de expresión regular está llena de barras invertidas (pero nunca al final, por lo que la cláusula "excepto" anterior no importa) y se ve un poco mejor cuando evitas duplicar cada una de ellas. - eso es todo. También ganó cierta popularidad para expresar rutas de archivos nativas de Windows (con barras invertidas en lugar de barras regulares como en otras plataformas), pero eso rara vez es necesario (ya que las barras normales también funcionan bien en Windows) y es imperfecto (debido a la cláusula "excepto"). arriba).

r'...'es una cadena de bytes (en Python 2.*), ur'...'es una cadena Unicode (nuevamente, en Python 2.*) y cualquiera de los otros tres tipos de comillas también produce exactamente los mismos tipos de cadenas (por ejemplo r'...', r'''...''', , r"...", r"""..."""son todas cadenas de bytes, etc.).

No estoy seguro de lo que quiere decir con "regresar " : no hay direcciones intrínsecamente hacia adelante y hacia atrás, porque no hay un tipo de cadena sin formato , es solo una sintaxis alternativa para expresar objetos de cadena perfectamente normales, bytes o Unicode como sean.

Y sí, en Python 2.*, por supuesto, siempre u'...' es'...' distinto de just : el primero es una cadena Unicode y el segundo es una cadena de bytes. La codificación en la que se podría expresar el literal es una cuestión completamente ortogonal.

Por ejemplo, considere (Python 2.6):

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

El objeto Unicode, por supuesto, ocupa más espacio de memoria (una diferencia muy pequeña para una cadena muy corta, obviamente ;-).

Alex Martelli avatar Jan 17 '2010 16:01 Alex Martelli

Hay dos tipos de cadenas en Python 2: el strtipo tradicional y el unicodetipo más nuevo. Si escribe un literal de cadena sin el udelante, obtendrá el strtipo antiguo que almacena caracteres de 8 bits, y con el udelante obtendrá el unicodetipo más nuevo que puede almacenar cualquier carácter Unicode.

No rcambia el tipo en absoluto, solo cambia cómo se interpreta la cadena literal. Sin r, las barras invertidas se tratan como caracteres de escape. Con r, las barras invertidas se tratan como literales. De cualquier manera, el tipo es el mismo.

ures, por supuesto, una cadena Unicode donde las barras invertidas son barras invertidas literales, no forman parte de los códigos de escape.

Puede intentar convertir una cadena Unicode en una cadena antigua usando la str()función, pero si hay caracteres Unicode que no se pueden representar en la cadena anterior, obtendrá una excepción. Puede reemplazarlos primero con signos de interrogación si lo desea, pero, por supuesto, esto haría que esos caracteres sean ilegibles. No se recomienda utilizar el strtipo si desea manejar correctamente los caracteres Unicode.

Mark Byers avatar Jan 17 '2010 16:01 Mark Byers

'cadena sin formato' significa que se almacena tal como aparece. Por ejemplo, '\'es solo una barra invertida en lugar de un escape .

xiaolong avatar Mar 06 '2012 01:03 xiaolong

Déjame explicarlo simplemente: en Python 2, puedes almacenar cadenas en 2 tipos diferentes.

El primero es ASCII , que es de tipo str en Python y utiliza 1 byte de memoria. (256 caracteres, almacenará principalmente alfabetos ingleses y símbolos simples)

El segundo tipo es UNICODE , que es de tipo Unicode en Python. Unicode almacena todo tipo de idiomas.

De forma predeterminada, Python preferirá el tipo str , pero si desea almacenar la cadena en tipo Unicode , puede colocar u delante del texto como u'text' o puede hacerlo llamando a unicode('text')

Entonces u es solo una forma corta de llamar a una función para convertir str a unicode . ¡Eso es todo!

Ahora la parte r , la coloca delante del texto para decirle a la computadora que el texto es texto sin formato, la barra invertida no debe ser un carácter de escape. r'\n' no creará un carácter de nueva línea. Es simplemente texto sin formato que contiene 2 caracteres.

Si desea convertir str a Unicode y también poner texto sin formato allí, use ur porque ru generará un error.

AHORA, la parte importante:

No puede almacenar una barra invertida usando r , es la única excepción. Entonces este código producirá un error: r'\'

Para almacenar una barra invertida (solo una), debe usar '\\'

Si desea almacenar más de 1 carácter, aún puede usar r, ya que r'\\' producirá 2 barras invertidas como esperaba.

No sé la razón por la cual r no funciona con un almacenamiento de barra invertida, pero nadie aún no la describe. Espero que sea un error.

offchan avatar Aug 25 '2015 21:08 offchan