Realmente no hay ninguna " cadena cruda "; hay literales de cadena sin procesar , que son exactamente los literales de cadena marcados con un 'r'
antes de la cita de apertura.
Un "literal de cadena sin formato" es una sintaxis ligeramente diferente para un literal de cadena, en el que una barra diagonal inversa \
se toma como "solo una barra diagonal inversa" (excepto cuando aparece justo antes de una cita que de lo contrario terminaría el literal) - no "secuencias de escape" para representar nuevas líneas, pestañas, espacios de retroceso, alimentación de formularios, etc. En los literales de cadena normales, cada barra invertida debe duplicarse para evitar ser tomada como el inicio de una secuencia de escape.
Esta variante de sintaxis existe principalmente porque la sintaxis de los patrones de expresión regular es pesada con barras invertidas (pero nunca al final, por lo que la cláusula "excepto" anterior no importa) y se ve un poco mejor cuando evita duplicar cada una de ellas. - eso es todo. También ganó algo de popularidad para expresar rutas de archivos nativas de Windows (con barras diagonales inversas en lugar de barras diagonales regulares como en otras plataformas), pero eso es muy raro (ya que las barras diagonales normales también funcionan bien en Windows) e imperfecto (debido a la cláusula "excepto" encima).
r'...'
es una cadena de bytes (en Python 2. *), ur'...'
es una cadena Unicode (de nuevo, en Python 2. *), y cualquiera de los otros tres tipos de citar también produce exactamente los mismos tipos de cuerdas (así por ejemplo r'...'
, r'''...'''
, r"..."
, r"""..."""
son todas cadenas de bytes, y así sucesivamente).
No estoy seguro de lo que quiere decir con " retroceder ": no hay direcciones intrínsecamente hacia atrás y hacia adelante, porque no hay un tipo de cadena sin procesar , es solo una sintaxis alternativa para expresar objetos de cadena perfectamente normales, byte o unicode, como pueden ser.
Y sí, en Python 2. *, u'...'
es decir , por supuesto, siempre distinto de simplemente '...'
- el primero es una cadena Unicode, esta última es una cadena de bytes. La codificación del literal podría expresarse en un problema 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 en la memoria (muy poca diferencia para una cadena muy corta, obviamente ;-).
u
yr
no son conmutativos:ur'str'
funciona,ru'str'
no. (al menos en ipython 2.7.2 en win7)r
cadenas y noté que si\
es el último carácter, no se tomará como un literal, sino que se escapará de la cita de cierre, causandoSyntaxError: EOL while scanning string literal
. Por lo tanto,\\
aún debe usarse para la instancia final de\
cualquier cadena que termine con una barra diagonal inversa.sys.getsizeof('cioa') == sys.getsizeof(r'cioa') == sys.getsizeof(u'cioa')
(Ubuntu 16.04 con UTF8 lang). Del mismo modo,type('cioa') == type(r'cioa') == type(u'cioa')
. PERO, la interpolación de cadena sin formato hace la diferencia, entoncessys.getsizeof('\ncioa') == sys.getsizeof(u'\ncioa') != sys.getsizeof(r'\ncioa')
Hay dos tipos de cadenas en python: el
str
tipo tradicional y elunicode
tipo más nuevo . Si escribe un literal de cadena sin elu
frente, obtiene elstr
tipo antiguo que almacena caracteres de 8 bits, y con elu
frente obtiene elunicode
tipo más nuevo que puede almacenar cualquier carácter Unicode.El
r
no cambia el tipo en absoluto, solo cambia la forma en que se interpreta el literal de cadena. Sin elr
, las barras invertidas se tratan como caracteres de escape. Con lasr
barras invertidas se tratan como literales. De cualquier manera, el tipo es el mismo.ur
es, por supuesto, una cadena Unicode donde las barras diagonales inversas son barras diagonales inversas, no forman parte de los códigos de escape.Puede intentar convertir una cadena Unicode en una cadena antigua utilizando la
str()
función, pero si hay caracteres Unicode que no se pueden representar en la cadena antigua, obtendrá una excepción. Puede reemplazarlos con signos de interrogación primero si lo desea, pero, por supuesto, esto haría que esos caracteres sean ilegibles. No se recomienda usar elstr
tipo si desea manejar correctamente los caracteres unicode.fuente
r"\"
trata de un error de sintaxis.'cadena sin procesar' significa que se almacena como aparece. Por ejemplo,
'\'
es solo una barra invertida en lugar de un escape .fuente
Un prefijo "u" denota que el valor tiene tipo en
unicode
lugar destr
.Los literales de cadena sin procesar, con un prefijo "r", escapan de cualquier secuencia de escape dentro de ellos, por lo que
len(r"\n")
es 2. Debido a que escapan las secuencias de escape, no puede finalizar un literal de cadena con una barra invertida simple: esa no es una secuencia de escape válida (por ejemplor"\"
)."Raw" no es parte del tipo, es simplemente una forma de representar el valor. Por ejemplo,
"\\n"
yr"\n"
son valores idénticos, al igual que32
,0x20
y0b100000
son idénticos.Puede tener literales de cadena sin formato Unicode:
La codificación del archivo fuente solo determina cómo interpretar el archivo fuente, de lo contrario no afecta a las expresiones o tipos. Sin embargo, se recomienda evitar el código donde una codificación distinta de ASCII cambiaría el significado:
fuente
Permítanme explicarlo simplemente: en python 2, puede almacenar cadenas en 2 tipos diferentes.
El primero es ASCII, que es tipo str en python, utiliza 1 byte de memoria. (256 caracteres, almacenarán 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 de cadena, 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 ')
Así que u es sólo una forma corta para llamar a una función de reparto str a Unicode . ¡Eso es!
Ahora la parte r , la pones 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 nuevo carácter de línea. Es solo texto sin formato que contiene 2 caracteres.
Si desea convertir str a unicode y también poner texto sin procesar allí, use ur porque ru generará un error.
AHORA, la parte importante:
No puede almacenar una barra invertida utilizando r , es la única excepción. Entonces este código producirá un error: r '\'
Para almacenar una barra invertida (solo una) necesita usar '\\'
Si desea almacenar más de 1 caracteres, puede usar r como r '\\' producirá 2 barras diagonales inversas como esperaba.
No sé la razón por la cual r no funciona con un almacenamiento de barra invertida, pero todavía no se describe la razón. Espero que sea un error.
fuente
r'\'
es ilegal, sino que incluso no puedes poner'\'
ninguno en la cola de ninguna cadena. Al igual quer'xxxxxx\'
es una cadena ilegal.str
. Lea más para una mejor comprensión aquí: medium.com/better-programming/…Tal vez esto sea obvio, tal vez no, pero puede hacer la cadena '\' llamando a x = chr (92)
fuente
x is y
se evalúa como verdadero en python3?x is y
evalúaTrue
por internarse. En su lugar, usex == y
(si no está comprobando si xey son exactamente el mismo objeto almacenado en una sola posición de memoria, es decir).Literales de cadena Unicode
Los literales de cadena Unicode (literales de cadena con el prefijo
u
) ya no se usan en Python 3. Todavía son válidos, pero solo para fines de compatibilidad con Python 2.Literales de cadena sin procesar
Si desea crear una cadena literal que consta de sólo caracteres fácilmente tipificables como letras o números en inglés, sólo tiene que escribir ellos:
'hello world'
. Pero si desea incluir también algunos personajes más exóticos, tendrá que usar una solución alternativa. Una de las soluciones son las secuencias de escape . De esta manera, por ejemplo, puede representar una nueva línea en su cadena simplemente agregando dos caracteres fáciles de escribir\n
a su literal de cadena. Entonces, cuando imprime la'hello\nworld'
cadena, las palabras se imprimirán en líneas separadas. Eso es muy útil!Por otro lado, hay algunas situaciones en las que desea crear un literal de cadena que contenga secuencias de escape, pero no desea que Python las interprete. Quieres que estén crudos . Mira estos ejemplos:
En tales situaciones, puede simplemente prefijar el literal de cadena con el
r
carácter de esta manera:r'hello\nworld'
y Python no interpretará ninguna secuencia de escape. La cadena se imprimirá exactamente como la creó.Los literales de cadena sin formato no son completamente "sin formato"?
Muchas personas esperan que los literales de cadena sin formato sean crudos en el sentido de que "Python ignora cualquier cosa colocada entre las comillas" . Eso no es verdad. Python todavía reconoce todas las secuencias de escape, simplemente no las interpreta, sino que las deja sin cambios. Significa que los literales de cadena sin procesar todavía tienen que ser literales de cadena válidos .
De la definición léxica de un literal de cadena:
Está claro que los literales de cadena (sin procesar o no) que contienen un carácter de comillas simples
'hello'world'
o que terminan con una barra diagonal inversa'hello world\'
no son válidos.fuente