如何使用Python格式化带有三引号的多行字符串?

Joa*_*nge 5 python string formatting escaping string-formatting

我在网上找不到这个,但基本上我有这样的字符串:

s = "name={0},
address={1},
nickname={2},
age={3},
comments=
"""
{4}
"""
"
Run Code Online (Sandbox Code Playgroud)

我需要使用如下变量格式化此字符串:

s.format("alice", "N/A", "alice", 18, "missing person")
Run Code Online (Sandbox Code Playgroud)

我无法更改那里的三重引号,因为将使用我的字符串的程序期望,否则将无法工作.

如何正确声明/转义此字符串?

nie*_*mmi 10

您可以对字符串使用三重单引号:

s = '''name={0},
address={1},
nickname={2},
age={3},
comments=
"""
{4}
"""
'''

print s.format("alice", "N/A", "alice", 18, "missing person")
Run Code Online (Sandbox Code Playgroud)

输出:

name=alice,
address=N/A,
nickname=alice,
age=18,
comments=
"""
missing person
"""
Run Code Online (Sandbox Code Playgroud)

  • @JoanVenge`'''`保留所有空白。如果您从下一行开始输入文字,则文字开头将带有\ n。同样,如果您打算将文本空白也放在其中。 (2认同)

Kev*_*ase 7

您可以使用以下方法转义字符串中的三引号,就像转义任何其他引号字符一样\:

s = """name={0},
address={1},
nickname={2},
age={3},
comments=
\"\"\"
{4}
\"\"\"
"""
Run Code Online (Sandbox Code Playgroud)

严格来说,你只需要逃避一个对的"角色---足以阻止三"""出现---但我觉得逃避所有三个使我的意图更加清晰.

后来...

sf = s.format("alice", "N/A", "alice", 18, "missing person")
print(sf)
print('----')
print(repr(sf))
Run Code Online (Sandbox Code Playgroud)

...生产:

name=alice,
address=N/A,
nickname=alice,
age=18,
comments=
"""
missing person
"""

----
'name=alice,\naddress=N/A,\nnickname=alice,\nage=18,\ncomments=\n"""\nmissing person\n"""\n'
Run Code Online (Sandbox Code Playgroud)

niemmi的答案有效,但前提是你在字符串中没有混合'''"""三重引号.使用反斜杠转义引号字符始终有效.

烦恼#1:尾随换行符

我打印了一行破折号以突出显示s保留了最后三个转义引号字符和实际结束字符串的三重引号之间的换行符.要从文字中删除它:

s = """[as before...]
\"\"\"
{4}
\"\"\""""
Run Code Online (Sandbox Code Playgroud)

烦恼#2:文字中保留的缩进

s文字的第二行和后续行必须与第一(左)列齐平.三引号字符串整齐地排列在缩进块内:

def indents_appear_in_string_literal():
    # This looks good but doesn't work right.
    s = """name={0},
    address={1},
    nickname={2},
    age={3},
    comments=
    \"\"\"
    {4}
    \"\"\"
    """
    sf = s.format("alice", "N/A", "alice", 18, "missing person")
    print(sf)
    print('----')
    print(repr(sf))
    return
Run Code Online (Sandbox Code Playgroud)

...将保留字面内的缩进:

name=alice,
    address=N/A,
    nickname=alice,
    age=18,
    comments=
    """
    missing person
    """

----
'name=alice,\n    address=N/A,\n    nickname=alice,\n    age=18,\n    comments=\n    """\n    missing person\n    """\n    '
Run Code Online (Sandbox Code Playgroud)

  • 为了解决第二个烦恼,请查看标准“textwrap”模块中的“dedent”和“indent”函数。在这里查找“dedent”:https://docs.python.org/3/library/textwrap.html?highlight=dedent#textwrap.dedent (2认同)