web-dev-qa-db-fra.com

Remplacer toutes les guillemets d'une chaîne par des guillemets échappés?

Étant donné une chaîne en python, telle que:

s = 'This sentence has some "quotes" in it\n'

Je veux créer une nouvelle copie de cette chaîne avec toutes les citations échappées (pour une utilisation ultérieure en Javascript). Donc, par exemple, ce que je veux, c'est produire ceci:

'This sentence has some \"quotes\" in it\n'

J'ai essayé d'utiliser replace(), comme:

s.replace('"', '\"')

mais cela renvoie la même chaîne. Alors j'ai essayé ceci:

s.replace('"', '\\"')

mais cela renvoie des guillemets à double échappement, tels que:

'This sentence has some \\"quotes\\" in it.\n'

Comment remplacer " Par \"?

MISE À JOUR:

J'ai besoin d'une sortie de ce texte copiable qui montre à la fois les guillemets et les retours à la ligne comme échappés. En d'autres termes, je veux pouvoir copier:

'This sentence has some \"quotes\" in it.\n'

Si j'utilise la chaîne brute et print le résultat j'obtiens la citation correctement échappée, mais la nouvelle ligne échappée ne s'imprime pas. Si je n'utilise pas print, j'obtiens mes nouvelles lignes mais des guillemets à double échappement. Comment puis-je créer une chaîne que je peux copier qui montre à la fois la nouvelle ligne et les guillemets échappés?

31
mix

Salut généralement lorsque je travaille avec Javascript, j'utilise le module json fourni par Python. Il échappera à la chaîne ainsi qu'à un tas d'autres choses comme l'a souligné user2357112.

import json
string = 'This sentence has some "quotes" in it\n'
json.dumps(string) #gives you '"This sentence has some \\"quotes\\" in it\\n"'
33
Yussuf S

Votre deuxième tentative est correcte, mais vous êtes confus par la différence entre le repr et le str d'une chaîne. Une façon plus idiomatique de faire votre deuxième méthode consiste à utiliser des "chaînes brutes":

>>> s = 'This sentence has some "quotes" in it\n'
>>> print s
This sentence has some "quotes" in it

>>> print s.replace('"', r'\"')  # raw string used here
This sentence has some \"quotes\" in it

>>> s.replace('"', r'\"')
'This sentence has some \\"quotes\\" in it\n'

Les chaînes brutes sont WYSIWYG: les barres obliques inverses dans une chaîne brute ne sont qu'un autre caractère. Il est - comme vous l'avez découvert - facile à confondre sinon ;-)

L'impression de la chaîne (l'avant-dernière sortie ci-dessus) montre qu'elle contient les caractères que vous souhaitez maintenant.

Sans print (la dernière sortie ci-dessus), Python applique implicitement repr() à la valeur avant de l'afficher. Le résultat est une chaîne qui produirait l'original si Python devait l'évaluer. C'est pourquoi les contre-coups sont doublés dans la dernière ligne. Ils ne sont pas dans la chaîne, mais sont nécessaires pour que si Python = devaient l'évaluer chaque \\ deviendrait un \ dans le résultat.

21
Tim Peters

Votre dernière tentative a fonctionné comme prévu. Les doubles barres obliques inverses que vous voyez sont simplement un moyen d'afficher les barres obliques inverses simples qui sont réellement dans la chaîne. Vous pouvez le vérifier en vérifiant la longueur du résultat avec len().

Pour plus de détails sur la double barre oblique inverse, voir: __repr__()


MISE À JOUR:

En réponse à votre question modifiée, qu'en est-il de l'un d'eux?

print repr(s).replace('"', '\\"')
print s.encode('string-escape').replace('"', '\\"')

Ou pour python 3:

print(s.encode('unicode-escape').replace(b'"', b'\\"'))
5
ʇsәɹoɈ