将字符串中的所有引号替换为转义引号?

57

给定一个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'

如何将"替换为\"

更新:

我需要从这个可复制的文本中输出,显示引号和换行符都已转义。换句话说,我想要能够复制:

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

如果我使用原始字符串并打印结果,我可以得到正确转义的引号,但是转义后的换行符不会被打印。如果我不使用print,那么我就可以得到我的换行符,但是双重转义的引号。如何创建一个字符串,我可以复制它显示出转义的换行和引号?

我可能漏掉了什么,但是你的第二个s.replace()似乎和第一个一样。 - Steven Liao
2
你最后的替换是正确的。尝试打印该字符串并查看发生了什么。 - inspectorG4dget
我非常确定'This sentence has some "quotes" in it\n'是一个有效的Javascript字符串字面量。 - user2357112
1
你确定只想替换引号吗?反斜杠、退格符和各种奇怪的东西通常也需要转义。repr(s) 可以捕获更多的内容,但我不知道结果是否总是有效的 JavaScript;对于 Unicode 字符串来说肯定不是。也许值得考虑使用 json。 - user2357112
3个回答

73

通常在使用JavaScript时,我会使用Python提供的json模块。它将转义字符串以及像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
这很不错,对我来说几乎可以工作了,但它没有转义单引号。我可以自己替换它们,但我觉得它不会自动转义有点奇怪。 - mix
1
json.dumps()不必转义单引号,因为它们在json中没有特殊含义。请记住,json只是JavaScript的一个子集。http://json.org/ - ʇsәɹoɈ
@mix如果单引号在双引号字符串内部,则无需转义。虽然Javascript支持单引号字符串,但JSON中的所有字符串都是双引号,因此json.dumps永远不需要转义单引号,因为它输出所有字符串都是双引号。 - Anentropic

28

你的第二次尝试是正确的,但你被字符串的reprstr之间的区别搞混了。更常见的方法是使用“原始字符串”来完成第二种方式:

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

原始字符串是所见即所得的:原始字符串中的反斜杠只是另一个字符。否则很容易产生混淆,正如您已经发现的那样 ;-)

打印字符串(上面倒数第二个输出)会显示它包含您现在想要的字符。

在没有print(上面最后一个输出)的情况下,Python 隐式地对值应用 repr() 然后再显示它。结果是将产生原始字符串的 Python 字符串。这就是为什么最后一行的反斜杠被加倍。它们不在字符串内,但是如果 Python 要评估它,每个 \\ 就会变成结果中的一个 \


我需要字符串出现转义引号,同时也要有转义换行符。换句话说,我希望可复制的输出看起来像:'This sentence has some \"quotes\" in it.\n'。如果我使用原始字符串并打印结果,我会得到正确转义的引号,但是转义的换行符不会打印。如果我不使用 print,那么我就会得到我的换行符,但是双重转义的引号。 - mix
1
然后你只需要再做一次替换,比如 .replace("\n", r"\n")。这将把换行符替换为两个字符反斜杠和字母 n。如果你还有其他需要转义的东西,这种方法会变得很繁琐;-) - Tim Peters

8
你上次的尝试效果符合你的期望。你看到的双斜杠只是一种显示实际字符串中单个反斜杠的方法。你可以通过使用len()函数来验证其长度。
关于双反斜杠的详细信息,请参见:__repr__()
更新:
针对你编辑后的问题,以下哪一个比较适合?
print repr(s).replace('"', '\\"')
print s.encode('string-escape').replace('"', '\\"')

或者对于Python 3:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接