Ignorar (deshabilitar) las secuencias de escape en Python con cadenas crudas

Negocio

'...', "..."En Python, si antepones a estos literales de cadena uno de los siguientes caracteres, el valor se convertirá en una cadena sin expandir la secuencia de escape.

  • r
  • R

Es útil cuando se trata de cadenas que utilizan muchas barras invertidas, como las rutas de Windows y los patrones de expresiones regulares.
La siguiente información se proporciona aquí.

  • secuencia de escape
  • Ignorar (deshabilitar) las secuencias de escape en las cadenas crudas
  • Convertir una cadena normal en una cadena sin procesar:repr()
  • Tenga en cuenta la barra invertida al final.

secuencia de escape

En Python, los caracteres que no pueden representarse en una cadena normal (como los tabuladores y las nuevas líneas) se describen mediante secuencias de escape con barras invertidas, de forma similar al lenguaje C. A continuación se muestra un ejemplo de secuencia de escape.

  • \t
  • \n
s = 'a\tb\nA\tB'
print(s)
# a b
# A B

Ignorar (deshabilitar) las secuencias de escape en las cadenas crudas

'...', "..."Si se antepone a un literal de cadena de este tipo uno de los siguientes elementos, el valor se convertirá en una cadena sin expandir la secuencia de escape. Este tipo de cadena se denomina cadena sin procesar.

  • r
  • R
rs = r'a\tb\nA\tB'
print(rs)
# a\tb\nA\tB

No existe un tipo especial llamado tipo de cadena cruda, es simplemente un tipo de cadena y es igual a una cadena normal con una barra invertida representada de la siguiente manera
\\

print(type(rs))
# <class 'str'>

print(rs == 'a\\tb\\nA\\tB')
# True

En una cadena normal, una secuencia de escape se considera un carácter, pero en una cadena sin procesar, las barras invertidas también se cuentan como caracteres. La longitud de la cadena y de cada carácter es la siguiente.

print(len(s))
# 7

print(list(s))
# ['a', '\t', 'b', '\n', 'A', '\t', 'B']

print(len(rs))
# 10

print(list(rs))
# ['a', '\\', 't', 'b', '\\', 'n', 'A', '\\', 't', 'B']

Ruta de Windows

El uso de la cadena bruta es útil cuando se quiere representar una ruta de Windows como una cadena.

Las rutas de Windows están separadas por barras invertidas, por lo que si se utiliza una cadena normal, hay que escapar la ruta como se indica a continuación, pero si se utiliza una cadena sin procesar, se puede escribir tal cual. Los valores son equivalentes.
\\

path = 'C:\\Windows\\system32\\cmd.exe'
rpath = r'C:\Windows\system32\cmd.exe'
print(path == rpath)
# True

Tenga en cuenta que una cadena que termine con un número impar de barras invertidas dará lugar a un error, como se describe a continuación. En este caso, es necesario escribir la cadena como una cadena normal, o concatenarla escribiendo sólo el final de la cadena como una cadena normal.

path2 = 'C:\\Windows\\system32\\'
# rpath2 = r'C:\Windows\system32\'
# SyntaxError: EOL while scanning string literal
rpath2 = r'C:\Windows\system32' + '\\'
print(path2 == rpath2)
# True

Convertir cadenas normales en cadenas brutas con repr()

Si desea convertir una cadena normal en una cadena cruda ignorando (deshabilitando) las secuencias de escape, puede utilizar la función incorporada repr().

s_r = repr(s)
print(s_r)
# 'a\tb\nA\tB'

Lo que devuelve repr() es una cadena que representa un objeto tal que tiene el mismo valor que cuando se le pasó a eval(), con caracteres iniciales y finales.

print(list(s_r))
# ["'", 'a', '\\', 't', 'b', '\\', 'n', 'A', '\\', 't', 'B', "'"]

Utilizando rodajas, podemos obtener una cadena equivalente a la cadena cruda con r adjunta.

s_r2 = repr(s)[1:-1]
print(s_r2)
# a\tb\nA\tB

print(s_r2 == rs)
# True

print(r'\t' == repr('\t')[1:-1])
# True

Tenga en cuenta la barra invertida al final.

Dado que una barra invertida escapa al carácter de comillas que le sigue, se producirá un error si hay un número impar de barras invertidas al final de la cadena. Un número par de barras invertidas es correcto.

# print(r'\')
# SyntaxError: EOL while scanning string literal

print(r'\\')
# \\

# print(r'\\\')
# SyntaxError: EOL while scanning string literal
Copied title and URL