Python экранирование фигурных скобок

How do I escape curly-brace (<>) characters in a string while using .format (or an f-string)?

For those who want to avoid doubling braces, and who are not averse to adding another dependency to their Python projects, there is also Jinja2 which definitively solves this problem, by allowing user-defined custom placeholder delimiter syntax.

23 Answers 23

>>> x = " > " >>> print(x.format(42)) ' < Hello >42 ' 

Format strings contain “replacement fields” surrounded by curly braces <> . Anything that is not contained in braces is considered literal text, which is copied unchanged to the output. If you need to include a brace character in the literal text, it can be escaped by doubling: > .

@Imray: <0>refers to the first argument to .format() . You can print more than one value like <0> as long as you give the same number of arguments to .format() . See docs.python.org/library/string.html#format-examples for extensive examples.

Python 3.6+ (2017)

In the recent versions of Python one would use f-strings (see also PEP498).

With f-strings one should use double >

If you need to resolve an expression in the brackets instead of using literal text you’ll need three sets of brackets:

Читайте также:  Код новая строка css

From my_greet = «HELLO» you can get as output, using just 2 sets of brackets, with print(f» < >«) . Just leave a space between brackets.

@Gwi7d31 No, f-strings are not a replacement for str.format() . For example, this answer I wrote is not possible with f-strings since the template is coming from input, not source code.

@wjandrea your link really doesn’t pertain to the OPs question. The OP wants to keep curly-braces while you are removing them in your linked answer via .format() and your dictionary unpacking method. If you want to preserve <> in Python 3.6+ and you want to insert a value into a string, this is the way . That’s the question at hand. I also never said f-strings are a replacement for .format(). You said that.

@Gwi What I’m saying is, this question is about str.format() , not f-strings, and they’re not mutually compatible.

You escape it by doubling the braces.

The OP wrote this comment:

I was trying to format a small JSON for some purposes, like this: ‘»>’.format(data) to get something like

It’s pretty common that the «escaping braces» issue comes up when dealing with JSON.

import json data = "1,2" mydict = json.dumps(mydict) 

It’s cleaner than the alternative, which is:

Using the json library is definitely preferable when the JSON string gets more complicated than the example.

Amen! It might seem like more work, but using libraries to do what libraries are supposed to do versus cutting corners. makes for better things.

But the order of the keys in a Python object isn’t guaranteed. Still, the JSON library is guaranteed to serialise in a JSON way.

wizzwizz4: Good point. From Python 3.6 onward, dictionaries are insertion ordered, so it wouldn’t be an issue. Versions of Python between 2.7 and 3.5 can use OrderedDict from the collections library.

The alternative is also terribly wrong if, e.g., data = ‘foo»‘ , because the » in the value of data won’t be properly escaped.

If you’re dealing with JSON, this answer is for you. It wins in terms of readability and maintainability — imagine dealing with complex JSON structures and a lot of double braces in it

You want to format a string with the character

You just have to double them.

name = "bob" print(f'Hello ! I want to print >> and >') 

Hello bob ! I want to print > and

number = 42 string = "bob" print(f'> >> >> ') 

Although not any better, just for the reference, you can also do this:

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

It can be useful for example when someone wants to print . It is maybe more readable than ‘>>’.format(‘argument’)

Note that you omit argument positions (e.g. <> instead of ) after Python 2.7

In case someone wanted to print something inside curly brackets using fstrings.

f-strings (python 3)

You can avoid having to double the curly brackets by using f-strings ONLY for the parts of the string where you want the f-magic to apply, and using regular (dumb) strings for everything that is literal and might contain ‘unsafe’ special characters. Let python do the string joining for you simply by stacking multiple strings together.

number = 42 print(" < Hello >" f" " "< thanks for all the fish >") ### OUTPUT: < Hello >42

NOTE: Line breaks between the strings are NOT required. I have only added them for readability. You could as well write the code above as shown below:

⚠️ WARNING: This might hurt your eyes or make you dizzy!

Implicit string concatenation is discouraged. Guido copied it from C but the reason why it’s needed there doesn’t really apply to Python. — groups.google.com/g/python-ideas/c/jP1YtlyJqxs?pli=1

If you need to keep two curly braces in the string, you need 5 curly braces on each side of the variable.

@TerryA there isn’t a difference in brace behavior between .format and f-strings. The code a = 1; print(‘>>>’.format(a=a)) produces the same results as a = 1; print(f’>>>’) .If you are going to be doing this a lot, it might be good to define a utility function that will let you use arbitrary brace substitutes instead, like

def custom_format(string, brackets, *args, **kwargs): if len(brackets) != 2: raise ValueError('Expected two brackets. Got <>.'.format(len(brackets))) padded = string.replace('', '>>') substituted = padded.replace(brackets[0], '<').replace(brackets[1], '>') formatted = substituted.format(*args, **kwargs) return formatted >>> custom_format(' process 1>', brackets='[]', cmd='firefox.exe') ' process 1>' 

Note that this will work either with brackets being a string of length 2 or an iterable of two strings (for multi-character delimiters).

Thought about that also. Of course, that will work too and the algorithm is simpler. But, imagine you have a lot of text like this, and you just want to parameterize it here and there. Everytime you create an input string you wouldn’t want to replace all those braces manually. You would just want to ‘drop in’ your parameterizations here and there. In this case, I think this method is both easier to think about and accomplish from a user perspective. I was inspired by linux’s ‘sed’ command which has similar capabilities to arbitrarily choose your delimiter based on what is convenient.

In short, I’d rather have the utility function be a little more complex than have it be a pain in the @$$ to use everytime. Please let me know if I misunderstood your proposition.

I’ve gone ahead and added a short demo to my public.lab space github.com/dreftymac/public.lab/blob/master/topic/python/…

Источник

Python: рецепты форматирования строк

Часто, когда возникает необходимость в форматировании строк, я забываю некоторые нюансы. В статье ниже рассмотрены всевозможные методы применения Python str.format() и его устаревшего аналога %.

Форматирование чисел

В следующей таблице показаны различные способы форматирования чисел с использованием функции str.format() в python, с примерами как для форматирования дробных, так и для целых чисел.

Для запуска примеров используйте print(«FORMAT».format(NUMBER)) Таким образом, чтобы получить результат первого примера, вы должны запустить: print(«».format(3.1415926))

Число Формат Результат Примечание
3.1415926 3.14 2 знака после запятой
3.1415926 +3.14 2 знака после запятой со знаком
-1 -1.00 2 знака после запятой со знаком
2.71828 3 Без знаков после запятой
5 2d> 05 Заполнение нулями слева (2 знака)
5 5xxx Заполнение нулями справа (4 знака)
10 10xx Заполнение нулями справа (4 знака)
1000000 1,000,000 Форматирование числа с разделителем запятой
0.25 25.00% Форматирование процентов
1000000000 1.00e+09 Обозначение экспоненты
13 13 Выровненный по правому краю (по умолчанию, ширина 10, пустое место заполняется пробельнами символами)
13 13 Выровненный слева (ширина 10)
13 13 Выровненный по центру (ширина 10)

Основы string.format()

Вот пара примеров базовой подстановки строк, вырожение <> является заполнителем для замещаемых переменных. Если формат не указан, он будет вставляться и форматироваться в виде строки.

s1 = "so much depends upon <>".format("a red wheel barrow") s2 = "glazed with <> water beside the <> chickens".format("rain", "white")

Вы также можете использовать числовое положение переменных и изменять их в строках, это дает некоторую гибкость при форматировании, если вы допустили ошибку в том порядке, который вы можете легко исправить, не перетасовывая все переменные.

s1 = " is better than ".format("emacs", "vim") s2 = " is better than ".format("emacs", "vim")

Старый метод ворматирования строк черех %

До python 2.6 способ форматирования строк, как правило, был немного проще, хотя и ограничен количеством аргументов, которые он может получить. Эти методы по-прежнему работают с Python 3.3, но есть скрытые угрозы, которые полностью не одобряют их. [РЕР-3101]

Форматирование числа с плавающей запятой:

pi = 3.14159 print(" pi = %1.2f " % pi)

Множественные замещения

s1 = "cats" s2 = "dogs" s3 = " %s and %s living together" % (s1, s2)

Недостаточное количество аргументов аргументы

Используя метод более старого формата, я бы часто получал ошибку «TypeError: not enough arguments for format string», потому что я неправильно определил свою замену, сделайте что-то вроде следующего.

set = " (%s, %s, %s, %s, %s, %s, %s, %s) " % (a,b,c,d,e,f,g,h,i)

Новый форматировщик строк python вы можете использовать пронумерованные параметры, поэтому вам не нужно подсчитывать, сколько у вас есть, по крайней мере, на половине его.

set = " (, , , , , , , ) ".format(a,b,c,d,e,f,g)

Больше примеров форматирования с функцией .format()

Функция format() предлагает множество дополнительных возможностей и возможностей, вот несколько полезных советов и трюков с использованием .format()

Именованные арргументы

Вы можете использовать новый строковый формат в качестве механизма шаблонов и использовать именованные аргументы, вместо того чтобы требовать строгий порядок.

madlib = " I the off the ".format(verb="took", object="cheese", place="table") ~~ I took the cheese off the table

Повторное использование одной переменной несколько раз

Используя %, требуется строгий порядок переменных, метод .format() позволяет поместить их в любом порядке, как мы видели выше, и также позволяет повторно их использовать.

str = "Oh , ! wherefore art thou ?".format("Romeo") ~~ Oh Romeo, Romeo! wherefore art thou Romeo?

Преобразование значений в разные форматы

Вы можете использовать следующие буквы для преобразования числа в свои форматы, decimal, hex, octal, binary

print(" - - - ".format(21)) ~~ 21 - 15 - 25 - 10101

Используем format как функцию

Вы можете использовать .format как функцию, которая позволяет отделять текст и форматирование от кода. Например, в начале вашей программы вы можете включить все ваши форматы, а затем использовать позже. Это также может быть хорошим способом справиться с интернационализацией, которая требует не только разного текста, но часто требует разных форматов для чисел.

## defining formats email_f = "Your email address was ".format ## use elsewhere print(email_f(email="bob@example.com"))

Экранирование фигурных скобок

Если вы хотите использовать фигурные скобки при использовании str.fromat(), просто продублируйте их.

print(» The <> set is often represented as >».format(«empty»)) ~~ The empty set is often represented as

Источник

Оцените статью