Заменить все кавычки в строке с экранированными кавычками?
Для строки в 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'\\"'))