Заменить все кавычки в строке с экранированными кавычками?

Для строки в python, например:

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

Я хочу создать новую копию этой строки с любыми экранированными кавычками (для дальнейшего использования в Javascript). Так, например, я хочу это сделать:

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

Я попытался использовать replace(), например:

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

но возвращает ту же строку. Итак, я попробовал это:

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

но возвращает double- экранированные кавычки, такие как:

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

Как заменить " на \"?

UPDATE:

Мне нужно в качестве вывода из этого текста для копирования, который показывает как кавычки, так и новые строки как экранированные. Другими словами, я хочу иметь возможность копировать:

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

Если я использую необработанную строку и print результат, я получаю правильно экранированную цитату, но экранированная новая строка не печатает. Если я не использую print, тогда я получаю свои новые строки, но double- экранированные кавычки. Как я могу создать строку, которую я могу скопировать, которая отображает обе строки и цитату?

Ответ 1

Привет обычно при работе с Javascript я использую модуль json, предоставляемый Python. Он будет избегать строки, а также множество других вещей, как указал 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"'

Ответ 2

Ваша вторая попытка правильная, но вы путаетесь в различии между repr и str строки. Более идиоматический способ сделать второй способ - использовать "необработанные строки":

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

Необработанные строки - WYSIWYG: обратные косые черты в исходной строке - это просто другой символ. Это - как вы обнаружили - легко путать иначе, -)

Печать строки (2nd- последний вывод выше) показывает, что она содержит нужные вам символы.

Без print (последний вывод выше), Python неявно применяет repr() к значению перед его отображением. Результатом является строка, которая создавала бы оригинал, если бы Python должен был ее оценить. Поэтому в последней строке зазоры удваиваются. Они не в строке, но необходимы, чтобы, если Python должен был ее оценить, каждый \\ стал бы одним \ в результате.

Ответ 3

Ваша последняя попытка работала так, как вы ожидали. Вы видите двойную обратную косую черту - это просто способ отображения одиночных обратных косых черт, которые на самом деле находятся в строке. Вы можете проверить это, проверив длину результата с помощью len().

Подробнее о двойном обратном слешке см. ниже: __repr__()


UPDATE:

В ответ на ваш отредактированный вопрос, как насчет одного из них?

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

Или для python 3:

print(s.encode('unicode-escape').replace(b'"', b'\\"'))