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 ;-).