Як я можу надрукувати буквальні фігурні фігурні символи в рядку python, а також використовувати .format на ньому?


1507
x = " \{ Hello \} {0} "
print(x.format(42))

дає мені: Key Error: Hello\\

Я хочу надрукувати вихід: {Hello} 42


1
Дивіться також: stackoverflow.com/questions/35574349
dreftymac

9
Для тих, хто хоче уникнути подвоєння брекетів ( {{ }}), використовуйте string.Template. Там ви підміняєте ідентифікатори форми $foo(зручно для генерації коду LaTeX).
Іоанніс Філіппідіс

Для тих, хто хоче уникнути подвоєння брекетів, і хто не проти додати ще одну залежність до своїх проектів Python, є також Jinja2, яка остаточно вирішує цю проблему, дозволяючи визначений користувачем синтаксис розмежувача власного заповнювача.
dreftymac

Відповіді:


2066

Вам потрібно подвоїти {{та }}:

>>> x = " {{ Hello }} {0} "
>>> print(x.format(42))
' { Hello } 42 '

Ось відповідна частина документації Python для синтаксису рядкових форматів :

Рядки формату містять "поля заміни", оточені фігурними дужками {}. Все, що не міститься в дужках, вважається буквальним текстом, який скопіюється без змін до виводу. Якщо вам потрібно включити дуговий символ у прямому тексті, його можна уникнути подвоєнням: {{і }}.


264
Тож якщо ви хочете надрукувати "{42}", ви б скористалися "{{{0}}}".format(42)!
обіймає

7
А як бути, якщо ви хочете одинарний фігурний брекет? "{ something { } {value}".format(42)не працює.
AJP

14
"{{" .format () та "}}". формат () друкує окремі фігурні дужки. У вашому прикладі: надрукуйте "{{щось {{}} {0}". Формат (42) надрукує "{щось {} 42".
Марк Віссер

2
Що {0}означає?
CodyBugstein

6
@Imray: {0}посилається на перший аргумент до .format(). Ви можете надрукувати більше ніж одне значення, наприклад, до {0} {1} {2}тих пір, поки ви надасте однакову кількість аргументів .format(). Див. Docs.python.org/library/string.html#format-examples для широких прикладів.
Грег Хьюгілл


60

Python 3.6+ (2017)

В останніх версіях Python можна було б використовувати f-рядки (див. Також PEP498 ).

Для f-рядків слід використовувати подвійний {{або}}

n = 42  
print(f" {{Hello}} {n} ")

виробляє бажане

 {Hello} 42

Якщо вам потрібно розв'язати вираз у дужках, а не використовувати буквальний текст, вам знадобляться три набори дужок:

hello = "HELLO"
print(f"{{{hello.lower()}}}")

виробляє

{hello}

46

ОП написав цей коментар:

Я намагався відформатувати невеликий JSON для якихось цілей, як-от так: '{"all": false, "selected": "{}"}'.format(data)щоб отримати щось подібне{"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 стає складнішим, ніж приклад.


1
Амінь! Це може здатися більшою роботою, але використання бібліотек для того, щоб робити те, що повинні робити бібліотеки, порівняно з вирізанням кутів ... сприяє кращим справам.
Пожежа Каолін

1
Але порядок ключів в об'єкті Python не гарантується ... Тим не менш, бібліотека JSON гарантує послідовну послідовність в JSON способі.
wizzwizz4

2
wizzwizz4: Добрий момент. З Python 3.6 далі словники впорядковуються вставкою, тому це не буде проблемою. Версії Python між 2.7 і 3.5 можуть використовувати OrdersDict з бібліотеки колекцій.
twasbrillig

24

Спробуйте зробити це:

x = " {{ Hello }} {0} "
print x.format(42)


14

Хоча не краще, лише для довідки, ви також можете зробити це:

>>> x = '{}Hello{} {}'
>>> print x.format('{','}',42)
{Hello} 42

Це може бути корисно, наприклад, коли хтось хоче надрукувати {argument}. Це, можливо, читабельніше, ніж'{{{}}}'.format('argument')

Зауважте, що після Python 2.7 пропущено позиції аргументів (наприклад, {}замість них {0})


5

Якщо ви збираєтеся робити це багато, можливо, було б добре визначити функцію утиліти, яка дозволить вам використовувати замість них довільні замінники брекетів, наприклад

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, або ітерабельним двома рядками (для розділових знаків з кількома символами).


Думав і про це. Звичайно, і це буде працювати, і алгоритм простіший. Але, уявіть, у вас є багато подібного тексту, і ви просто хочете його параметризувати тут і там. Щоразу, коли ви створюєте рядок введення, ви не хочете замінювати всі ці дужки вручну. Ви просто хочете «впустити» свої параметри та тут. У цьому випадку, я думаю, що цей спосіб і простіше продумати і здійснити з точки зору користувача. Мене надихнула команда "sed" Linux, яка має подібні можливості для довільного вибору роздільника на основі зручного.
tvt173

Коротше кажучи, я вважаю за краще, щоб функція утиліти була трохи складнішою, ніж було б боліти в $ $ $ використовувати щоразу. Будь ласка, дайте мені знати, якщо я неправильно зрозумів вашу пропозицію.
tvt173

Я пішов вперед і додав коротку демонстрацію до свого public.lab space github.com/dreftymac/public.lab/blob/master/topic/python/…
dreftymac

3

Нещодавно я натрапив на це, тому що хотів ввести струни в попередньо відформатований 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")

Виконує роботу, якщо продуктивність не є проблемою.


Простий І елегантний для інтеграції в існуючий код з невеликими необхідними змінами. Дякую!
Колона01

2

Якщо вам потрібно зберегти два фігурні дужки в рядку, вам потрібно 5 фігурних дужок з кожної сторони змінної.

>>> myvar = 'test'
>>> "{{{{{0}}}}}".format(myvar)
'{{test}}'

Для тих, хто використовує f-рядки, використовуйте 4 фігурні дужки з обох боків замість 5
TerryA

0

Причина полягає в тому, {}чи синтаксис .format()так у вашому випадку .format()не розпізнається, {Hello}тому він видав помилку.

ви можете змінити це за допомогою подвійних фігурних брекетів {{}},

x = " {{ Hello }} {0} "

або

спробуйте %sформатувати текст,

x = " { Hello } %s"
print x%(42)  

0

Я натрапив на цю проблему, намагаючись надрукувати текст, який я можу скопіювати, вставити в документ Латекс. Я продовжую цю відповідь і використовую названі замінні поля:

Скажімо, ви хочете роздрукувати добуток змінних mulitple з такими індексами, як введіть тут опис зображення, наприклад , у Latex було б $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))

-1

Якщо ви хочете роздрукувати лише один фігурний брекет (наприклад {), ви можете використовувати {{, і ви можете додати більше дужок пізніше в рядку, якщо хочете. Наприклад:

>>> 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'

-1

Коли ви просто намагаєтесь інтерполювати рядки коду, я б запропонував використовувати 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))

Таким чином, ви не будете змушені дублювати фігурні дужки, як підказує ціла купа інших відповідей


-3

Це можна зробити за допомогою методу необробленого рядка, просто додавши символ "r" без лапок перед рядком.

# to print '{I am inside braces}'
print(r'{I am inside braces}')

Привіт! Ви можете повторно перевірити це; Друкує Python 3.7 \{I am inside braces\}.
Теодор

1
@Teodor вибачте за це. Тепер я виправив це, надрукувавши як необроблений рядок.
Різкий
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.