【问题标题】:Replace all quotes in a string with escaped quotes?用转义引号替换字符串中的所有引号?
【发布时间】:2013-09-24 01:27:27
【问题描述】:

在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 结果,我得到正确转义的引号,但转义的换行符不会打印。如果我不使用print,那么我会得到我的换行符但双引号。如何创建一个我可以复制的字符串来显示换行符和引号已转义?

【问题讨论】:

  • 我可能遗漏了什么,但您的第二个 s.replace() 似乎与第一个相同。
  • 您最后的替换是正确的。尝试printing 字符串,看看会发生什么
  • 我很确定 'This sentence has some "quotes" in it\n' 是一个有效的 Javascript 字符串文字。
  • 您确定要替换引号吗?反斜杠、退格和其他各种奇怪的废话通常也需要转义。 repr(s) 捕获了更多的东西,虽然我不知道结果是否总是有效的 Javascript;它绝对不适用于 unicode 字符串。 json 也可能值得研究。

标签: python string replace


【解决方案1】:

您好,通常在使用 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"'

【讨论】:

  • 这很好,几乎对我有用,但它不会转义单引号。我可以自己换掉它们,但我觉得奇怪的是它还没有这样做。
  • json.dumps() 不必转义单引号,因为它们在 json 中没有特殊含义。请记住,json 只是 JavaScript 的一个子集。 json.org
  • @mix 如果单引号在双引号字符串中,则不需要转义它们。虽然 Javascript 支持单引号字符串,但 JSON 中的所有字符串都是双引号,因此 json.dumps 将永远不需要转义单引号,因为它会输出双引号中的所有字符串。
【解决方案2】:

您的第二次尝试是正确的,但您对字符串的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 对其进行评估,每个 \\ 将在结果中变成一个 \

【讨论】:

  • 我需要字符串与转义引号一起出现,但也与转义换行符一起出现。 IOW,我希望可复制的输出看起来像:'This sentence has some \"quotes\" in it.\n'。如果我使用原始字符串并打印结果,我会得到正确转义的引号,但不会打印转义的换行符。如果我不使用print,那么我会得到我的换行符但双引号。
  • 那你只需要再做一次替换,比如.replace("\n", r"\n")。这用两个字符反斜杠和字母 n 替换换行符。如果您还有其他需要逃避的事情,这种方法会变得乏味;-)
【解决方案3】:

您的最后一次尝试按预期进行。您看到的双反斜杠只是显示字符串中实际存在的单个反斜杠的一种方式。您可以通过使用len() 检查结果的长度来验证这一点。

有关双反斜杠的详细信息,请参阅:__repr__()


更新:

回答您编辑的问题,其中一个怎么样?

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

或者对于 python 3:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    相关资源
    最近更新 更多