Làm cách nào tôi có thể in các ký tự xoăn chữ trong chuỗi python và cũng có thể sử dụng .format trên đó?


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

đưa cho tôi : Key Error: Hello\\

Tôi muốn in đầu ra: {Hello} 42



9
Đối với những người muốn tránh tăng gấp đôi niềng răng ( {{ }}), 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).
Ioannis Filippidis

Đối với những người muốn tránh nhân đôi, và những người không phản đối việc thêm một phụ thuộc khác vào các dự án Python của họ, cũng có Jinja2 giải quyết dứt điểm vấn đề này, bằng cách cho phép cú pháp dấu phân cách giữ chỗ tùy chỉnh do người dùng xác định.
dreftymac

Câu trả lời:


2070

Bạn cần tăng gấp đôi {{}}:

>>> 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: {{}}.


264
Vì vậy, nếu bạn muốn in "{42}", bạn sẽ sử dụng "{{{0}}}".format(42)!
hughes

7
Còn nếu bạn muốn một chiếc nẹp xoăn đơn thì sao? "{ something { } {value}".format(42)không hoạt động.
AJP

14
"{{" .format () và "}}". format () in dấu ngoặc nhọn đơn. Trong ví dụ của bạn: in "{{Something {{}} {0}". Format (42) sẽ in "{Something {} 42".
Mark Visser

2
{0}nghĩa là gì?
CodyBugstein

6
@Imray: {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.
Greg Hewgill

74

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

60

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}

46

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 jsonthư 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ụ.


1
Amen! Nó có vẻ như nhiều công việc hơn, nhưng sử dụng các thư viện để làm những gì các thư viện phải làm so với cắt góc ... làm cho những điều tốt hơn.
Lửa cao lanh

1
Nhưng thứ tự của các khóa trong một đối tượng Python không được đảm bảo ... Tuy nhiên, thư viện JSON được đảm bảo tuần tự hóa theo cách JSON.
wizzwizz4

2
wizzwizz4: Điểm tốt. Từ Python 3.6 trở đi, từ điển được chèn theo thứ tự, vì vậy nó sẽ không thành vấn đề. Các phiên bản Python giữa 2.7 và 3.5 có thể sử dụng OrderedDict từ thư viện bộ sưu tập.
twasbrillig

24

Hãy thử làm điều này:

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


14

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


5

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ự).


Nghĩ về điều đó cũng có. Tất nhiên, điều đó cũng sẽ làm việc và thuật toán đơn giản hơn. Nhưng, hãy tưởng tượng bạn có rất nhiều văn bản như thế này, và bạn chỉ muốn tham số hóa nó ở đây và ở đó. Mỗi khi bạn tạo một chuỗi đầu vào, bạn sẽ không muốn thay thế tất cả các dấu ngoặc đó bằng tay. Bạn sẽ chỉ muốn 'thả vào' các tham số của bạn ở đây và ở đó. Trong trường hợp này, tôi nghĩ phương pháp này vừa dễ suy nghĩ vừa hoàn thành từ góc độ người dùng. Tôi đã được truyền cảm hứng bởi lệnh 'sed' của linux có khả năng tương tự như việc tùy ý chọn dấu phân cách của bạn dựa trên những gì thuận tiện.
tvt173

Nói tóm lại, tôi muốn có chức năng tiện ích phức tạp hơn một chút so với việc sử dụng @ $$ để sử dụng mọi lúc. Xin vui lòng cho tôi biết nếu tôi hiểu sai đề xuất của bạn.
tvt173

Tôi đã đi trước và thêm một bản demo ngắn vào không gian public.lab tôi github.com/dreftymac/public.lab/blob/master/topic/python/...
dreftymac

3

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 đề.


Đơn giản và thanh lịch để tích hợp vào mã hiện có với ít sửa đổi cần thiết. Cảm ơn!
Cột01

2

Nếu bạn cần giữ hai dấu ngoặc nhọn trong chuỗi, bạn cần 5 dấu ngoặc nhọn ở mỗi bên của biến.

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

Đối với những người sử dụng chuỗi f, sử dụng 4 dấu ngoặc nhọn ở hai bên thay vì 5
TerryA

0

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)  

0

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ư nhập mô tả hình ảnh ở đây, 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))

-1

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'

-1

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


-3

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

Xin chào! Bạn có thể muốn kiểm tra lại; Python 3.7 in \{I am inside braces\}.
Teodor

1
@Teodor xin lỗi vì điều đó. Bây giờ tôi đã sửa lỗi này bằng cách in dưới dạng chuỗi thô.
Harsh Aggarwal
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.