Substituir todas as aspas num texto por aspas fugitivas?

foi dada uma sequência em python, como:

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

Eu quero criar uma nova cópia desse texto com quaisquer citações escapadas (para uso posterior em Javascript). Então, por exemplo, o que eu quero é produzir isto:

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

tentei usar replace(), tais como:

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

Mas isso devolve o mesmo texto. Então tentei isto:

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

Mas isso devolve aspas de dupla fuga, tais como:

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

Como substituir " por \"?

actualização:

preciso do resultado deste texto copiável que mostra tanto as aspas como as linhas novas como escapadas. Por outras palavras, quero poder copiar:

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

Se eu usar a string raw e {[[9] } o resultado eu recebo a citação corretamente escapada, mas a newline escapada não imprime. Se eu não usar print Então eu tenho minhas novas linhas, mas citações de dupla fuga. Como posso criar um texto que eu posso copiar que mostra tanto newline e quote escapou?

Author: mix, 2013-09-19

3 answers

Hi normalmente quando se trabalha com Javascript eu uso o módulo json fornecido pelo Python. Ele vai escapar da corda, bem como um monte de outras coisas como user2357112 apontou.

import json
string = 'This sentence has some "quotes" in it\n'
json.dumps(string) #gives you '"This sentence has some \\"quotes\\" in it\\n"'
 29
Author: Yussuf S, 2013-09-19 05:33:23

A tua segunda tentativa está correcta, mas estás a ficar confuso pela diferença entre o repr e o str de uma corda. Uma maneira mais idiomática de fazer sua segunda maneira é usar "strings raw":

>>> 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'

As cadeias Raw são WYSIWYG: as barras invertidas numa cadeia raw são apenas mais um carácter. É - como você descobriu-fácil ficar confuso de outra forma; -)

Imprimir o texto (o 2º último resultado acima) mostra que contém os caracteres que deseja agora.

Sem print (o último resultado acima), o Python aplica implicitamente repr() ao valor antes de o mostrar. O resultado é uma cadeia que produziria o original se o Python a avaliasse. É por isso que os backlashes são dobrados na última linha. Eles não estão na string, mas são necessários para que se Python avaliasse cada \\ se tornaria um \ no resultado.

 18
Author: Tim Peters, 2013-09-19 05:20:36
A sua última tentativa funcionou como esperava. As barras duplas que você vê são simplesmente uma forma de mostrar as barras simples que estão realmente no texto. Você pode verificar isso, verificando o comprimento do resultado com len(). Para mais detalhes sobre a dupla barra invertida, veja: __repr__()

Actualização:

Em resposta à sua pergunta editada, que tal uma destas?
print repr(s).replace('"', '\\"')
print s.encode('string-escape').replace('"', '\\"')

Ou para python 3:

print(s.encode('unicode-escape').replace(b'"', b'\\"'))
 5
Author: ʇsәɹoɈ, 2013-09-19 06:43:03