¿Cómo obtengo la representación en bruto de una cadena en Python?

Estoy haciendo una clase que se basa principalmente en expresiones regulares.

Digamos que mi clase se ve así:

class Example: def __init__(self, regex): self.regex = regex def __repr__(self): return 'Example({})'.format(repr(self.regex.pattern)) 

Y digamos que lo uso así:

 import re example = Example(re.compile(r'\d+')) 

Si repr(example) , obtengo 'Example('\\\\d+')' , pero quiero 'Example(r'\\d+')' . Tenga en cuenta la barra invertida adicional en la que, al imprimirla, aparece correctamente. Supongo que podría implementarlo para devolver el "r'{}'".format(regex.pattern) , pero eso no me sienta bien. En el improbable caso de que Python Software Foundation algún día cambie la manera de especificar literales de cadenas en bruto, mi código no lo reflejará. Aunque eso es hipotético. Mi principal preocupación es si esto siempre funciona o no. Sin embargo, no puedo pensar en un caso de borde en la parte superior de mi cabeza. ¿Hay una manera más formal de hacer esto?

EDIT: nada parece aparecer en el Mini-lenguaje de especificación de formato , la guía de formato de printf estilo printf o el módulo de string .

El problema con la representación de cadenas crudas es que no puede representar todo de manera portátil (es decir, sin usar caracteres de control). Por ejemplo, si tenías un salto de línea en tu cadena, tenías que romper literalmente la cadena en la siguiente línea, porque no se puede representar como cadena sin formato.

Dicho esto, la forma real de obtener una representación de cadena cruda es lo que ya proporcionó:

 "r'{}'".format(regex.pattern) 

La definición de rawstrings es que no hay reglas aplicadas, excepto que terminan en el carácter de comillas con el que comienzan y que se puede escapar de dicho carácter de comilla con una barra invertida. Por lo tanto, por ejemplo, no puede almacenar el equivalente de una cadena como "\" en la representación de cadena sin formato ( r"\" produce SyntaxError r"\\" produce "\\\\" ).

Si realmente quieres hacer esto, debes usar una envoltura como:

 def rawstr(s): """ Return the raw string representation (using r'') literals of the string *s* if it is available. If any invalid characters are encountered (or a string which cannot be represented as a rawstr), the default repr() result is returned. """ if any(0 <= ord(ch) < 32 for ch in s): return repr(s) if (len(s) - len(s.rstrip("\\"))) % 2 == 1: return repr(s) pattern = "r'{0}'" if '"' in s: if "'" in s: return repr(s) elif "'" in s: pattern = 'r"{0}"' return pattern.format(s) 

Pruebas:

 >>> test1 = "\\" >>> test2 = "foobar \n" >>> test3 = r"a \valid rawstring" >>> test4 = "foo \\\\\\" >>> test5 = r"foo \\" >>> test6 = r"'" >>> test7 = r'"' >>> print(rawstr(test1)) '\\' >>> print(rawstr(test2)) 'foobar \n' >>> print(rawstr(test3)) r'a \valid rawstring' >>> print(rawstr(test4)) 'foo \\\\\\' >>> print(rawstr(test5)) r'foo \\' >>> print(rawstr(test6)) r"'" >>> print(rawstr(test7)) r'"'