2010-03-11 15 views
29

en python, dada una variable que contiene una cadena, ¿hay alguna forma rápida de convertirla en otra variable de cadena sin formato?casting cadenas en bruto python

el siguiente código debe ilustrar lo que estoy después ...

def checkEqual(x, y): 
    print True if x==y else False 

line1 = "hurr..\n..durr" 
line2 = r"hurr..\n..durr" 
line3 = "%r"%line1 

print "%s \n\n%s \n\n%s \n" % (line1, line2, line3) 

checkEqual(line2, line3)  #outputs False 

checkEqual(line2, line3[1:-1]) #outputs True 

El más cercano que he encontrado hasta ahora es la bandera de formato% r que parece devolver una cadena cruda aunque dentro de comillas simples. ¿Hay alguna manera más fácil de hacer esto como un line3 = raw(line1) tipo de cosa?

+0

No utilice la palabra "emitir". Python no tiene tal cosa. Desea "transformar" o "convertir" una cadena sin formato en otra cadena. "rápido" tampoco tiene nada que ver con eso. –

+2

'checkEqual' simplemente puede ser' return x == y' – pradyunsg

+1

Gracias @Schoolboy por señalarlo. Siempre me consume ver algo tan redundante como 'print True if True else False':/ – OozeMeister

Respuesta

61
"hurr..\n..durr".encode('string-escape') 
+6

nice one. str.encode() con varios códecs es exactamente lo que buscaba. 'Unicode-escape' en realidad resuelve otro problema que estaba teniendo también. cheers – dave

+1

Esto no funciona para '\ w' etc. –

+7

Recibo un error en Python3.3 LookupError: codificación desconocida: string-escape – Erik

3

embargo, otra forma:

>>> s = "hurr..\n..durr" 
>>> print repr(s).strip("'") 
hurr..\n..durr 
+0

Eso no funcionará si 's' tiene un' ''en él –

+0

Debería estar bien si el'' 'está en el medio de la cadena, pero definitivamente no es robusto (es complicado con cadenas Unicode, por ejemplo) . – Seth

0
>>> v1 = 'aa\1.js' 
>>> re.sub(r'(.*)\.js', repr(v1).strip("'"), 'my.js', 1) 
'aa\\x01.js 

Pero

>>> re.sub(r'(.*)\.js', r'aa\1.js', 'my.js', 1) 
'aamy.js' 

Y

>>> re.sub(r'(.*)\.js', raw(v1), 'my.js', 1) 
'aamy.js' 

Y mejor método EJECUCIÓ prima ntation

def raw(text): 
    """Returns a raw string representation of text""" 
    return "".join([escape_dict.get(char,char) for char in text]) 
1

Arriba se muestra cómo codificar.

'hurr..\n..durr'.encode('string-escape') 

De esta forma se decodificará.

r'hurr..\n..durr'.decode('string-escape') 

Ej.

In [12]: print 'hurr..\n..durr'.encode('string-escape') 
hurr..\n..durr 

In [13]: print r'hurr..\n..durr'.decode('string-escape') 
hurr.. 
..durr 

Esto permite "fundir/trasformar cadenas sin procesar" en ambas direcciones. Un caso práctico es cuando el json contiene una cadena en bruto y quiero imprimirlo muy bien.

{ 
    "Description": "Some lengthy description.\nParagraph 2.\nParagraph 3.", 
    ... 
} 

Me gustaría hacer algo como esto.

print json.dumps(json_dict, indent=4).decode('string-escape')