web-dev-qa-db-ja.com

Pythonを使用して、内部に三重引用符を含む複数行の文字列をフォーマットするにはどうすればよいですか?

これはオンラインで見つかりませんでしたが、基本的に次のような文字列があります。

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

そして、次のような変数を使用して、この文字列をフォーマットする必要があります。

s.format("alice", "N/A", "alice", 18, "missing person")

私の文字列を使用するプログラムはそれを期待しているので、そこで三重引用符を変更することはできません。そうしないと機能しません。

この文字列を正しく宣言/エスケープするにはどうすればよいですか?

5
Joan Venge

文字列にはトリプル一重引用符を使用できます。

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

print s.format("alice", "N/A", "alice", 18, "missing person")

出力:

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

\を使用すると、他の引用符文字をエスケープするのと同じ方法で、文字列内の三重引用符をエスケープできます。

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

厳密に言えば、"文字の1つをエスケープするだけで済みます---トリプル"""が表示されないようにするのに十分です---しかし私は見つけました3つすべてをエスケープすると、私の意図がより明確になります。

後で...

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

...生産:

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'

niemmiの回答 は機能しますが、文字列内に'''"""の三重引用符が混在していない場合に限ります。バックスラッシュで引用符をエスケープすることは常に機能します

煩わしさ#1:末尾の改行

ダッシュの行を印刷して、sが最後の3つのエスケープされた引用符文字と実際に文字列を終了したトリプル引用符の間の改行を保持していることを強調しました。リテラルから削除するには:

s = """[as before...]
\"\"\"
{4}
\"\"\""""

煩わしさ#2:リテラル内に保存されたインデント

sリテラルの2行目以降は、最初の(左側の)列と同じ高さである必要があります。インデントされたブロック内にきちんと並んだ三重引用符の文字列:

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

...リテラル内のインデントを保持します:

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    '
7
Kevin J. Chase

@niemmiのアプローチを使用できます。これは完全にうまく機能します。各行の最後に円記号を追加して、次の行に進むことを示すこともできます。

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