2013-09-19 3 views
23

Учитывая строку в Python, например:Заменить все кавычки в строке с экранированными кавычками?

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

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

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

Я попытался с помощью replace(), таких как:

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

но возвращает ту же строку. Затем я попытался это:

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

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

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

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

UPDATE:

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

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

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

+0

Возможно, мне что-то не хватает, но ваш второй 's.replace()' кажется таким же, как первый. –

+0

thx, опечатка, исправлена ​​ – mix

+2

Ваша последняя замена правильная. Попробуйте 'print' строку и посмотреть, что произойдет – inspectorG4dget

ответ

24

Привет, обычно при работе с 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"' 
+0

это приятно и почти работает для меня, но это не ускользает от одиночных кавычек. я могу сам их заменить, но мне кажется странным, что он этого не делает. – mix

+0

'json.dumps()' не нужно избегать одиночных кавычек, потому что они не имеют особого значения в json. Помните, что json - это всего лишь подмножество JavaScript. http://json.org/ –

5

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

Подробные сведения о двойной обратной косой вещи, см: __repr__()


UPDATE:

В ответ на отредактированном вопрос, как об одном из них?

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

Или для Python 3:

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

Ваша вторая попытка правильно, но вы получаете смущает разница между 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: слеш сырой строки просто еще один символ. Это, как вы обнаружили, легко найти в другом месте ;-)

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

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

+0

Мне нужна строка, которая появляется с экранированными кавычками, а также с экранированной новой строкой. IOW, я хочу, чтобы результат с возможностью копирования выглядел следующим образом: ''В этом предложении есть некоторые« кавычки »в нем. \ N''. Если я использую необработанную строку и печатаю результат, я получаю правильно экранированную цитату, но экранированная новая строка не печатает. Если я не использую 'print', тогда я получаю свои новые строки, но с двойными экранами. – mix

+1

Тогда вам просто нужно сделать другую замену, например '.replace (" \ n ", r" \ n ")'. Это заменяет символ новой строки двумя символами обратной косой черты и буквой n. Если у вас также есть другие вещи, которые вам нужно убежать, этот подход станет утомительным ;-) –

Смежные вопросы