2011-01-24 12 views
81

La primera vez que la usé para generar expresiones regulares en varias líneas como argumento de método en re.compile(), entonces asumí que r significa RegEx.¿Qué significa preceder a un literal de cadena con "r"?

Por ejemplo:

regex = re.compile(
    r'^[A-Z]' 
    r'[A-Z0-9-]' 
    r'[A-Z]$', re.IGNORECASE 
) 

Entonces, ¿qué significa r en este caso? ¿Por qué lo necesitamos?

+0

Tenga en cuenta que la división de las cadenas sobre varias líneas dentro de paréntesis, no tiene nada que ver con el carácter de prefijo - esto es sólo un ejemplo de la concatenación de cadenas automática de Python, y funciona con cualquier prefijo o ninguna. –

+1

Anteponer una cadena con una letra como 'r' o 'u' significa que necesita leer la documentación. Seriamente. "Jugar con diferentes personajes" es lo peor que puedes hacer. No aprenderá mucho de esa manera y lo que aprenderá será lento y confuso. Por favor, lea la documentación. Por favor. –

+7

Lo intenté. Dije: "Me está resultando difícil buscar la respuesta en los documentos, ya que no sé cómo se llaman formalmente". - No tuve el lujo del tiempo para mirar realmente. Ya sabes, fechas límite y esas cosas. : P Solo busqué "prefijo de cadena python", y aunque el enlace de la respuesta superior a "Análisis léxico" fue el 2 ° resultado, "Análisis léxico" me alejó un poco de la lectura de la página vinculada, ya que sonaba como una lectura pesada. –

Respuesta

107

La r significa que la cadena debe tratarse como una cadena sin procesar, lo que significa que se ignorarán todos los códigos de escape.

Para un ejemplo:

'\n' será tratado como un carácter de nueva línea, mientras que r'\n' serán tratados como los personajes \ seguido por n.

When an 'r' or 'R' prefix is present, a character following a backslash is included in the string without change, and all backslashes are left in the string. For example, the string literal r"\n" consists of two characters: a backslash and a lowercase 'n' . String quotes can be escaped with a backslash, but the backslash remains in the string; for example, r"\"" is a valid string literal consisting of two characters: a backslash and a double quote; r"\" is not a valid string literal (even a raw string cannot end in an odd number of backslashes). Specifically, a raw string cannot end in a single backslash (since the backslash would escape the following quote character). Note also that a single backslash followed by a newline is interpreted as those two characters as part of the string, not as a line continuation.

Fuente: Python string literals

+3

_Dios_ hoy me has ahorrado un gran dolor de cabeza. Tuve un problema que me atormentaba durante semanas, solo para descubrir que me faltaba una 'r' en mis parámetros. Gracias, en serio. –

+0

la barra invertida \ '\\' no puede ser la última carta base o un error 'SyntaxError: EOL al explorar la cadena literal '. Para Python3 es 'print (r" Test \ new ")' – Arthur

+0

la interpolación de cadenas con '.format()' aún funciona en cadenas sin formato. [Ejemplos de formato] (https://docs.python.org/3.6/library/string.html#format-examples) –

23

Significa que los escapes no serán traducidos. Por ejemplo:

r'\n' 

es una cadena con una barra invertida seguida de la letra n. (Sin el r sería una nueva línea.)

b significa byte-string y se utiliza en Python 3, donde las cadenas son Unicode por defecto. En Python 2.x las cadenas eran byte-strings por defecto y usted usaría u para indicar Unicode.

+1

Olvidaste esto: http://docs.python.org/reference/lexical_analysis.html#string-literals –

Cuestiones relacionadas