x = " \{ Hello \} {0} "
print(x.format(42))
đưa cho tôi : Key Error: Hello\\
Tôi muốn in đầu ra: {Hello} 42
{{ }}
), sử dụng string.Template
. Ở đó bạn thay thế các định danh của biểu mẫu $foo
(tiện dụng để tạo mã LaTeX).
x = " \{ Hello \} {0} "
print(x.format(42))
đưa cho tôi : Key Error: Hello\\
Tôi muốn in đầu ra: {Hello} 42
{{ }}
), sử dụng string.Template
. Ở đó bạn thay thế các định danh của biểu mẫu $foo
(tiện dụng để tạo mã LaTeX).
Câu trả lời:
Bạn cần tăng gấp đôi {{
và }}
:
>>> x = " {{ Hello }} {0} "
>>> print(x.format(42))
' { Hello } 42 '
Đây là phần có liên quan của tài liệu Python cho cú pháp chuỗi định dạng :
Chuỗi định dạng có chứa “lĩnh vực thay thế” bao quanh bởi dấu ngoặc nhọn
{}
. Bất cứ điều gì không có trong dấu ngoặc nhọn được coi là văn bản bằng chữ, được sao chép không thay đổi vào đầu ra. Nếu bạn cần bao gồm một ký tự dấu ngoặc trong văn bản chữ, nó có thể được thoát bằng cách nhân đôi:{{
và}}
.
"{{{0}}}".format(42)
!
"{ something { } {value}".format(42)
không hoạt động.
{0}
nghĩa là gì?
{0}
đề cập đến đối số đầu tiên .format()
. Bạn có thể in nhiều hơn một giá trị {0} {1} {2}
miễn là bạn đưa ra cùng số lượng đối số .format()
. Xem docs.python.org/l Library / chuỗi.html # format- examples để biết ví dụ mở rộng.
Bạn thoát khỏi nó bằng cách nhân đôi niềng răng.
Ví dụ:
x = "{{ Hello }} {0}"
print(x.format(42))
Python 3.6+ (2017)
Trong các phiên bản gần đây của Python, người ta sẽ sử dụng chuỗi f (xem thêm PEP498 ).
Với chuỗi f nên sử dụng gấp đôi {{
hoặc}}
n = 42
print(f" {{Hello}} {n} ")
tạo ra mong muốn
{Hello} 42
Nếu bạn cần giải quyết một biểu thức trong ngoặc thay vì sử dụng văn bản bằng chữ, bạn sẽ cần ba bộ dấu ngoặc:
hello = "HELLO"
print(f"{{{hello.lower()}}}")
sản xuất
{hello}
OP đã viết bình luận này:
Tôi đã cố gắng định dạng một JSON nhỏ cho một số mục đích, như thế này:
'{"all": false, "selected": "{}"}'.format(data)
để có được một cái gì đó như{"all": false, "selected": "1,2"}
Một điều khá phổ biến là vấn đề "thoát niềng răng" xuất hiện khi làm việc với JSON.
Tôi đề nghị làm điều này:
import json
data = "1,2"
mydict = {"all": "false", "selected": data}
json.dumps(mydict)
Nó sạch hơn so với giải pháp thay thế, đó là:
'{{"all": false, "selected": "{}"}}'.format(data)
Sử dụng json
thư viện chắc chắn là thích hợp hơn khi chuỗi JSON trở nên phức tạp hơn so với ví dụ.
Mặc dù không tốt hơn, chỉ để tham khảo, bạn cũng có thể làm điều này:
>>> x = '{}Hello{} {}'
>>> print x.format('{','}',42)
{Hello} 42
Nó có thể hữu ích ví dụ khi ai đó muốn in {argument}
. Nó có thể dễ đọc hơn'{{{}}}'.format('argument')
Lưu ý rằng bạn bỏ qua các vị trí đối số (ví dụ {}
thay vì {0}
) sau Python 2.7
Nếu bạn sẽ làm điều này rất nhiều, có thể tốt để xác định một chức năng tiện ích sẽ cho phép bạn sử dụng thay thế niềng răng tùy ý, như
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}'
Lưu ý rằng điều này sẽ hoạt động với dấu ngoặc là một chuỗi có độ dài 2 hoặc lặp lại của hai chuỗi (đối với các dấu phân cách nhiều ký tự).
Gần đây tôi đã gặp phải điều này, vì tôi muốn đưa các chuỗi vào JSON được định dạng sẵn. Giải pháp của tôi là tạo ra một phương thức trợ giúp, như thế này:
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
Sau đó, bạn có thể làm một cái gì đó như:
formatted = preformat("""
{
"foo": "{{bar}}"
}""").format(bar="gas")
Hoàn thành công việc nếu hiệu suất không phải là vấn đề.
Lý do là, {}
cú pháp .format()
như vậy trong trường hợp của bạn .format()
không nhận ra {Hello}
nên nó đã gây ra lỗi.
bạn có thể ghi đè lên nó bằng cách sử dụng dấu ngoặc kép {{}},
x = " {{ Hello }} {0} "
hoặc là
thử %s
định dạng văn bản,
x = " { Hello } %s"
print x%(42)
Tôi đã vấp phải vấn đề này khi cố gắng in văn bản, tôi có thể sao chép dán vào tài liệu latex. Tôi mở rộng câu trả lời này và sử dụng các trường thay thế được đặt tên:
Hãy nói rằng bạn muốn in ra một sản phẩm của các biến số có các chỉ số như
, trong latex sẽ là $A_{ 0042 }*A_{ 3141 }*A_{ 2718 }*A_{ 0042 }$
mã sau đây thực hiện công việc với các trường được đặt tên để cho nhiều chỉ số có thể đọc được:
idx_mapping = {'i1':42, 'i2':3141, 'i3':2178 }
print('$A_{{ {i1:04d} }} * A_{{ {i2:04d} }} * A_{{ {i3:04d} }} * A_{{ {i1:04d} }}$'.format(**idx_mapping))
Nếu bạn muốn chỉ in một dấu ngoặc nhọn (ví dụ {
) bạn có thể sử dụng {{
và bạn có thể thêm nhiều dấu ngoặc sau trong chuỗi nếu bạn muốn. Ví dụ:
>>> 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'
Khi bạn chỉ cố gắng nội suy các chuỗi mã, tôi khuyên bạn nên sử dụng jinja2 , một công cụ mẫu đầy đủ tính năng cho Python, tức là:
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))
Vì vậy, bạn sẽ không bị ép buộc phải nhân đôi dấu ngoặc nhọn như toàn bộ câu trả lời khác cho thấy
Bạn có thể làm điều này bằng cách sử dụng phương thức chuỗi thô bằng cách thêm ký tự 'r' mà không có dấu ngoặc kép trước chuỗi.
# to print '{I am inside braces}'
print(r'{I am inside braces}')
\{I am inside braces\}
.