Как я могу напечатать буквенные фигурные скобки в строке Python, а также использовать.format на нем?
x = " \{ Hello \} {0} "
print x.format(42)
дает мне: Key Error: Hello\\
Я хочу напечатать вывод: {Hello} 42
27 ответов
Вам нужно удвоить {{
а также }}
:
>>> x = " {{ Hello }} {0} "
>>> print x.format(42)
' { Hello } 42 '
Вот соответствующая часть документации по Python для синтаксиса строки формата:
Строки формата содержат "замещающие поля", заключенные в фигурные скобки
{}
, Все, что не содержится в фигурных скобках, считается буквальным текстом, который копируется без изменений в выходные данные. Если вам нужно включить символ скобки в буквальный текст, его можно избежать путем удвоения:{{
а также}}
,
Python 3.6+ (2017)
В последних версиях Python можно использовать f-строки (см. Также PEP498).
С f-струнами нужно использовать двойной {{
или же }}
n = 42
print(f" {{Hello}} {n} ")
производит желаемое
{Hello} 42
Если вам нужно разрешить выражение в скобках вместо использования литерального текста, вам понадобится три набора скобок:
hello = "HELLO"
print(f"{{{hello.lower()}}}")
производит
{hello}
Вы избегаете этого, удваивая скобки.
Например:
x = "{{ Hello }} {0}"
print x.format(42)
Вы хотите отформатировать строку с помощью символа или
Вам просто нужно их удвоить.
формат
{
с участием
f'{{'
а также
}
с участием
f'}}'
Так :
name = bob
print(f'Hello {name} ! I want to print }} and {{')
Выход :
Привет, боб! Я хочу напечатать} и {
ОП написал этот комментарий:
I was trying to format a small JSON for some purposes, like this: '{"all": false, "selected": "{}"}'.format(data) to get something like {"all": false, "selected": "1,2"}
Довольно часто возникает проблема с "выходящими скобками" при работе с JSON.
Я предлагаю сделать это:
import json
data = "1,2"
mydict = {"all": "false", "selected": data}
json.dumps(mydict)
Это чище, чем альтернатива, а именно:
'{{"all": false, "selected": "{}"}}'.format(data)
С использованием json
библиотека определенно предпочтительнее, когда строка JSON становится более сложной, чем в примере.
Попробуйте сделать это:
x = " {{ Hello }} {0} "
print x.format(42)
Хотя не лучше, просто для справки, вы также можете сделать это:
>>> x = '{}Hello{} {}'
>>> print x.format('{','}',42)
{Hello} 42
Это может быть полезно, например, когда кто-то хочет напечатать {argument}
, Это может быть более читабельным, чем '{{{}}}'.format('argument')
Обратите внимание, что вы опускаете позиции аргументов (например, {}
вместо {0}
) после Python 2.7
f-строки (Python 3)
Вы можете избежать удвоения фигурных скобок, используя f-строки только для тех частей строки, к которым вы хотите применить f-magic, и используя обычные строки для всего, что является буквальным. Позвольте python выполнить соединение строк за вас, просто сложив несколько строк вместе.
number = 42
print(" { Hello }"
f" {number} "
"{ thanks for all the fish }")
### OUTPUT:
{ Hello } 42 { thanks for all the fish }
ПРИМЕЧАНИЕ. Разрывы строк не требуются. Я поставил их только для того, чтобы было удобнее читать. Вы могли бы также написать это как
"{Hello}"f"{number}"
.
key = "FOOBAR"
print(f"hello {{{key}}}")
выходы
hello {FOOBAR}
На случай, если кто-то захочет напечатать что-то внутри фигурных скобок, используя fstrings.
Если вам нужно сохранить в строке две фигурные скобки, вам понадобится по 5 фигурных скобок с каждой стороны переменной.
>>> myvar = 'test'
>>> "{{{{{0}}}}}".format(myvar)
'{{test}}'
Если вы собираетесь делать это много, было бы неплохо определить вспомогательную функцию, которая позволит вам вместо этого использовать произвольные заменители скобок, например
def custom_format(string, brackets, *args, **kwargs):
if len(brackets) != 2:
raise ValueError('Expected two brackets. Got {}.'.format(len(brackets)))
padded = string.replace('{', '{{').replace('}', '}}')
substituted = padded.replace(brackets[0], '{').replace(brackets[1], '}')
formatted = substituted.format(*args, **kwargs)
return formatted
>>> custom_format('{{[cmd]} process 1}', brackets='[]', cmd='firefox.exe')
'{{firefox.exe} process 1}'
Обратите внимание, что это будет работать либо со скобками, являющимися строкой длины 2, либо с итерацией из двух строк (для многосимвольных разделителей).
Я недавно столкнулся с этим, потому что хотел вставить строки в предварительно отформатированный JSON. Моим решением было создать вспомогательный метод, например:
def preformat(msg):
""" allow {{key}} to be used for formatting in text
that already uses curly braces. First switch this into
something else, replace curlies with double curlies, and then
switch back to regular braces
"""
msg = msg.replace('{{', '<<<').replace('}}', '>>>')
msg = msg.replace('{', '{{').replace('}', '}}')
msg = msg.replace('<<<', '{').replace('>>>', '}')
return msg
Затем вы можете сделать что-то вроде:
formatted = preformat("""
{
"foo": "{{bar}}"
}""").format(bar="gas")
Выполняет свою работу, если производительность не является проблемой.
Причина в том, {}
это синтаксис .format()
так в вашем случае .format()
не узнает {Hello}
так что выкинуло ошибку.
вы можете переопределить его, используя двойные фигурные скобки {{}},
x = " {{ Hello }} {0} "
или же
пытаться %s
для форматирования текста,
x = " { Hello } %s"
print x%(42)
Я до смешного опаздываю на эту вечеринку. Мне удалось разместить скобки в заменяющем элементе, например:
print('{0} {1}'.format('{hello}', '{world}'))
который печатает
{hello} {world}
Строго говоря, это не то, о чем спрашивает OP, поскольку он / она хочет скобки в строке формата, но это может кому-то помочь.
Я использовал двойной {{}}, чтобы предотвратить добавление значения fstring,
например, вот мой оператор Postgres UPDATE для обновления столбца целочисленного массива, который принимает выражение {} для захвата массива, то есть:
порты = '{100,200,300}'
с fstrings его,
ports = [1,2,3]
query = f"""
UPDATE table SET ports = '{{{ports}}}' WHERE id = 1
"""
фактическая инструкция запроса будет,
UPDATE table SET ports = '{1,2,3}'
что является действительным заявлением postgres
Если вы хотите напечатать только одну сторону фигурной скобки:
a=3
print(f'{"{"}{a}')
>>> {3
Вы можете использовать «стенку кавычек», чтобы отделить отформатированную строковую часть от обычной строковой части.
Из:
print(f"{Hello} {42}")
к
print("{Hello}"f" {42}")
Более ясным примером может быть
string = 10
print(f"{string} {word}")
Выход:
NameError: name 'word' is not defined
Теперь добавьте стену с цитатами следующим образом:
string = 10
print(f"{string}"" {word}")
Выход:
10 {word}
Ты можешь использовать String.Template()
:
from string import Template
s = Template('$txt, $num')
s.substitute(txt='{Hello}', num='42 ')
Я столкнулся с этой проблемой при попытке распечатать текст, который можно скопировать и вставить в латексный документ. Я расширяю этот ответ и использую именованные поля замены:
Допустим, вы хотите распечатать продукт из нескольких переменных с такими индексами, как
, которые в латексе будут
$A_{ 0042 }*A_{ 3141 }*A_{ 2718 }*A_{ 0042 }$
Следующий код выполняет работу с именованными полями, так что для многих индексов он остается читаемым:
idx_mapping = {'i1':42, 'i2':3141, 'i3':2178 }
print('$A_{{ {i1:04d} }} * A_{{ {i2:04d} }} * A_{{ {i3:04d} }} * A_{{ {i1:04d} }}$'.format(**idx_mapping))
Или просто параметризовать сам кронштейн? Наверное, очень многословно.
x = '{open_bracket}42{close_bracket}'.format(open_bracket='{', close_bracket='}')
print(x)
# {42}
Если вам нужны фигурные скобки в шаблоне f-строки, который можно форматировать, вам необходимо вывести строку, содержащую две фигурные скобки в наборе фигурных скобок для f-строки:
css_template = f"{{tag}} {'{{'} margin: 0; padding: 0;{'}}'}"
for_p = css_template.format(tag="p")
# 'p { margin: 0; padding: 0;}'
Если вы хотите напечатать только одну фигурную скобку (например,{
) ты можешь использовать {{
, и вы можете добавить фигурные скобки позже в строку, если хотите. Например:
>>> f'{{ there is a curly brace on the left. Oh, and 1 + 1 is {1 + 1}'
'{ there is a curly brace on the left. Oh, and 1 + 1 is 2'
Вы можете сделать это, используя метод необработанной строки, просто добавив перед строкой символ 'r' без кавычек.
# to print '{I am inside braces}'
print(r'{I am inside braces}')
Когда вы просто пытаетесь интерполировать строки кода, я бы предложил использовать jinja2, который является полнофункциональным механизмом шаблонов для Python, то есть:
from jinja2 import Template
foo = Template('''
#include <stdio.h>
void main() {
printf("hello universe number {{number}}");
}
''')
for i in range(2):
print(foo.render(number=i))
Таким образом, вы не будете вынуждены дублировать фигурные скобки, как предлагает целый ряд других ответов.
Используйте escape-последовательности для выхода из фигурных скобок в f-строке. Пример:print(f'{a={1}}')
Если вам нужно заключить скобки вокруг значения ключа словарей параметров или списков метода форматирования, попробуйте следующее:
>>> "{o}Hello {a}{c}".format(**{"o":"{","c":"}","a":42})
'{Hello 42}'