如何在Python原始字符串字面量中包含双引号和/或单引号字符?

116

考虑以下情况:

>>> r"what"ever"
SyntaxError: invalid syntax
>>> r"what\"ever"
'what\\"ever'

那么我们如何获取引号而不包括斜杠呢?

请不要建议使用r'what"ever',因为那样问题就变成了如何同时包含这两种引号?

相关问题


在原始字符串的激励用例中(正则表达式和其他一些情况下,除Python之外的其他东西解释反斜杠),反斜杠是可以的,因为它将由正则表达式引擎/任何引擎处理。这并不适用于您可能想要使用原始字符串的所有情况,但请确保在尝试删除反斜杠之前考虑它是否适用于您的用例。 - user2357112
7个回答

189

如果你想在字符串中使用双引号但不使用单引号,你只需将单引号作为定界符即可:

r'what"ever'

如果你的字符串中需要两种引号,可以使用三重引号字符串:

r"""what"ev'er"""

如果你想在同一个字符串中包含两种三引号字符串(这是非常不可能的情况),那么你无法做到,你需要使用带转义字符的非原始字符串。


4
好的,我会尽力将以下内容翻译成通俗易懂的中文,同时不改变原意,也不提供解释:太好了。花了我一点时间才意识到我还可以将三引号字符串设为原始字符串。 - mpen
3
我也喜欢最后一段……这正是我试图弄清楚的。不同引号风格的限制。我正在比较Python的 r"原始字符串" 和C#的 @"@引号字符串""""三重引号字符串""" - mpen
2
Python新手在这里,有点困惑,r'what"ever'不是解析错误吗?你是不是想说r'what"ever' - nmr
7
他们确实有一个转义系统,只需使用非原始字符串(没有 r 放在前面的字符串),它就可以工作,这与其他几乎所有语言一样。具体请参考链接:https://docs.python.org/3.1/reference/lexical_analysis.html#string-and-bytes-literals。 - Cobertos
3
@MiniQuark:r''''foo"'''r""""foo'"""可以很好地生成这样的字符串。 - Adam Rosenfield
显示剩余3条评论

15

如果您需要任何类型的引号(单引号、双引号和三重引号),可以将字符串“组合”(0):

>>> raw_string_with_quotes = r'double"' r"single'" r'''double triple""" ''' r"""single triple''' """
>>> print raw_string_with_quotes
double"single'double triple""" single triple'''

你也可以将"原始字符串"(0)与非原始字符串结合使用:

>>> r'raw_string\n' 'non-raw string\n'
'raw_string\\nnon-raw string\n'
(0): 实际上,Python解析器会将字符串连接在一起,而不是创建多个字符串。如果添加"+"运算符,则会创建并组合多个字符串。

10

Python有多种字符串表示方式。以下的字符串语法可以让你使用双引号:

'''what"ever'''

2
你漏掉了问题中的 raw 部分。 - mpen

5

自从我偶然发现了这个答案,它对我有很大的帮助,但是我发现了一个小的语法问题,我觉得我应该避免其他人可能会遇到的困惑。三引号字符串对于描述的情况有效,但请注意,如果你想在字符串中使用的 " 出现在字符串本身的末尾:

somestr = """This is a string with a special need to have a " in it at the end""""

执行时会出现错误,因为四个连续的引号""""使字符串读取器混淆,它认为已经到达了字符串的末尾,然后发现一个随机的"。您可以通过在4个引号之间插入一个空格来验证这一点,如下所示:" """,这样就不会出错。

在这种特殊情况下,您需要使用以下方法之一:

somestr = 'This.....at the end"'

或者使用上述方法,通过混合使用 " 和 ' 构建多个字符串,然后在事后将它们连接起来。

5
不用担心,答案是原始三引号字符串:

Nevermind,答案是原始三引号字符串:

r"""what"ever"""

2

为了包含新的Python f字符串兼容功能:

var_a = 10

f"""This is my quoted variable: "{var_a}". """

f-strings 支持转义,所以你可以这样做 f"foo\"bar" - mpen

-3

使用:

dqote='"'
sqote="'"

使用'+'运算符和dqotesquote变量来获取你需要的内容。

如果我想要sed -e s/",u'"/",'"/g -e s/^"u'"/"'"/,你可以尝试以下方法:

dqote='"'
sqote="'"
cmd1="sed -e s/" + dqote + ",u'" + dqote + "/" + dqote + ",'" + dqote + '/g -e s/^"u' + sqote + dqote + '/' + dqote + sqote + dqote + '/'

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