Aunque noté el patrón, ¿pero cómo funciona la barra invertida en cadena teóricamente?

'@#2_#]&*^%$\]'

salida : '@#2_#]&*^%$\\]'

'@#2_#]&*^%$\\]'

salida : '@#2_#]&*^%$\\]'

'@#2_#]&*^%$\\\]'

salida : '@#2_#]&*^%$\\\\]'

2
Jalene 6 oct. 2019 a las 07:33

3 respuestas

La mejor respuesta

De su comentario de seguimiento:

Lo que me desconcertó es en mi ejemplo, no se escapa. La barra invertida simple produce barras invertidas dobles. Las barras invertidas dobles producen barras invertidas dobles. Las barras invertidas triples producen barras invertidas cuádruples .....

Para ser claros: su primer resultado es una cadena con una barra invertida una . Python muestra dos barras invertidas en su representación de la cadena.

Cuando ingresa la cadena con una barra invertida simple, Python no trata la secuencia \] en la entrada como una secuencia de escape especial y, por lo tanto, \ se convierte en una barra invertida real en la cadena real, y ] en un corchete de cierre. Citando de la documentación vinculada por Klaus D .:

A diferencia del Estándar C, todas las secuencias de escape no reconocidas se dejan en la cadena sin cambios, es decir, la barra invertida se deja en el resultado . (Este comportamiento es útil al depurar: si una secuencia de escape está mal escrita, la salida resultante se reconoce más fácilmente como rota).

Cuando ingresa la cadena con una barra invertida doble, la secuencia \\ es una secuencia de escape para una barra invertida simple , y luego la ] es solo una ].

De cualquier manera, cuando Python le muestra la cadena de nuevo, utiliza \\ para la barra invertida real, porque no mira hacia adelante para determinar que una barra invertida funcionaría; la barra invertida siempre se escapa.


Para entrar en un poco más de detalle: Python no se preocupa por cómo especificó la cadena en primer lugar: tiene una forma específica "normalizada" que depende solo de lo que realmente contiene la cadena. Podemos ver esto jugando con las diferentes formas de citar una cadena:

>>> 'foo'
'foo'
>>> "foo"
'foo'
>>> r'foo'
'foo'
>>> """foo"""
'foo'

La forma normalizada usará comillas dobles si eso evita secuencias de escape para comillas simples:

>>> '\'\'\''
"'''"

Pero volverá a las comillas simples si la cadena contiene ambos tipos de comillas:

>>> '\'"'
'\'"'
>>> "'\"'
'\'"'

(Ejercicio: ¿cuántos caracteres hay realmente en esta cadena y cuáles son? ¿Cuántas barras invertidas contiene la cadena?)

Contiene dos caracteres, una comilla simple y una comilla doble, y no barras invertidas.

0
Karl Knechtel 6 oct. 2019 a las 05:59

Para el primer patrón '@#2_#]&*^%$\]' \ no se escapa, por lo que en la salida se agrega uno \ más para escapar. Para el segundo patrón '@#2_#]&*^%$\\]' \ ya se ha escapado en el patrón, por lo que no hay nuevos \ en la salida. Para el tercer patrón '@#2_#]&*^%$\\\]' primero \ escapa el segundo \ y el tercero \ se está escapando agregando uno más \ en la salida. Entonces cuatro \. Espero eso ayude.

0
Sudhansu Kumar 6 oct. 2019 a las 05:36

La barra invertida \ se usa para escapar de los caracteres que, de lo contrario, tienen un significado especial, como la nueva línea, la barra invertida o el carácter de comillas. Los literales de cadena pueden opcionalmente tener como prefijo una letra 'r' o 'R'; Estas cadenas se denominan cadenas sin procesar y utilizan diferentes reglas para las secuencias de escape de barra invertida.

A menos que haya un prefijo 'r' o 'R', las secuencias de escape en cadenas se interpretan de acuerdo con reglas similares a las utilizadas por el Estándar C.

En estricta compatibilidad con el Estándar C, se aceptan hasta tres dígitos octales, pero se toma un número ilimitado de dígitos hexadecimales como parte del escape hexadecimal (y luego los 8 bits inferiores del número hexadecimal resultante se usan en implementaciones de 8 bits )

A diferencia del Estándar C, todas las secuencias de escape no reconocidas se dejan en la cadena sin cambios, es decir, la barra diagonal inversa se deja en la cadena. (Este comportamiento es útil al depurar: si una secuencia de escape está mal escrita, la salida resultante se reconoce más fácilmente como rota).

Cuando hay un prefijo 'r' o 'R', las barras invertidas todavía se usan para citar el siguiente carácter, pero todas las barras invertidas se dejan en la cadena. Por ejemplo, la cadena literal r "\ n" consta de dos caracteres: una barra diagonal inversa y una minúscula `n '. Las comillas de cadena se pueden escapar con una barra diagonal inversa, pero la barra diagonal inversa permanece en la cadena; por ejemplo, r "\" "es un literal de cadena válido que consta de dos caracteres: una barra diagonal inversa y una comilla doble; r" \ "no es un literal de cadena de valor (incluso una cadena sin formato no puede terminar en un número impar de barras diagonales inversas). Específicamente, una cadena sin formato no puede terminar en una barra diagonal inversa simple (ya que la barra diagonal inversa escaparía al siguiente carácter de comillas). Observe también que una barra diagonal inversa simple seguida de una nueva línea se interpreta como esos dos caracteres como parte de la cadena, no como una continuación de línea .

1
David Rechtman 6 oct. 2019 a las 04:40
58254234