2010-03-11 6 views
29

en python, étant donné une variable qui contient une chaîne, y a-t-il un moyen rapide de convertir cela en une autre variable de chaîne brute?lancer des chaînes brutes python

le code suivant devrait illustrer ce im aprè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 

Le plus proche que j'ai trouvé est à ce jour le% r formatage drapeau qui semble renvoyer une chaîne brute mais entre guillemets simples. Existe-t-il un moyen plus facile de faire cela comme un line3 = raw(line1) genre de chose?

+0

Veuillez ne pas utiliser le mot "cast". Python n'a pas une telle chose. Vous voulez "transformer" ou "convertir" une chaîne brute en une autre chaîne. "rapide" n'a rien à voir avec ça non plus. –

+2

'checkEqual' peut simplement être' return x == y' – pradyunsg

+1

Merci @Schoolboy pour le signaler. Cela me brûle toujours de voir quelque chose d'aussi redondant que «print True if True else False»:/ – OozeMeister

Répondre

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

sympa. str.encode() avec les différents codecs est exactement ce que je recherchais. 'Unicode-escape' résout en fait un autre problème que j'avais aussi. acclamations – dave

+1

Cela ne fonctionne pas pour '\ w' etc. –

+7

Je reçois une erreur dans Python3.3 LookupError: encodage inconnu: string-escape – Erik

3

Encore une autre façon:

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

Cela ne marchera pas si 's' contient un' '' '' dedans –

+0

Cela devrait être correct si le '' 'est au milieu de la chaîne, mais ce n'est certainement pas robuste (c'est vicieux avec les chaînes Unicode, par exemple) . – Seth

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

Mais

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

Et

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

Et meilleure méthode brute EXÉCUTIO ntation

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

Au-dessus, il a été montré comment coder.

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

De cette façon décodera.

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

Ex.

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

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

Cela permet de "lancer/transformer des chaînes brutes" dans les deux sens. Un cas pratique est quand le json contient une chaîne brute et je veux l'imprimer bien.

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

Je ferais quelque chose comme ceci.

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