Làm cách nào tôi có thể chọn lọc thoát phần trăm (%) trong chuỗi Python?


364

Tôi có đoạn mã sau

test = "have it break."
selectiveEscape = "Print percent % in sentence and not %s" % test

print(selectiveEscape)

Tôi muốn nhận đầu ra:

Print percent % in sentence and not have it break.

Điều gì thực sự xảy ra:

    selectiveEscape = "Use percent % in sentence and not %s" % test
TypeError: %d format: a number is required, not str

57
Tại sao không phải là nó \%? Đó là dự đoán của tôi, tôi ngạc nhiên khi thấy nó %%thay vào đó - có vẻ khá phản trực giác.
Demis

3
% icó nghĩa là "một biểu diễn thập phân của một số nguyên, được đệm trái với khoảng trắng.
Antti Haapala

3
Lối thoát là chức năng, không phải cú pháp ngôn ngữ. Do đó, nếu thoát là \%nó thực sự sẽ được \\%viết bằng mã thông thường. <escape><escape>là mô hình điển hình mà tôi đã thấy, và \tình cờ là nhân vật thoát phổ biến nhất, tốt hơn hoặc xấu hơn.
shemnon

1
@Demis và làm thế nào để bạn thoát \ nếu bạn phải in \\%? Bạn nhất định yêu cầu trốn thoát thông qua việc lặp lại các ký tự đặc biệt, nếu các ký tự đặc biệt cũng không đặc biệt tùy theo hoàn cảnh.
Sass NF

2
Tôi nghĩ thật khó chịu trong Python khi% theo nghĩa đen được mã hóa bởi "%%" chứ không phải bởi "\%".
MasterControl

Câu trả lời:


625
>>> test = "have it break."
>>> selectiveEscape = "Print percent %% in sentence and not %s" % test
>>> print selectiveEscape
Print percent % in sentence and not have it break.

38
Trong Python 3.3.5, print('%s%%' % 100)in 100%. Nhưng print('%%')in %%. Vì vậy, có vẻ như bạn không phải thoát các dấu hiệu% nếu bạn không thay thế.
Zenadix

5
@Zenadix Điều này cũng đúng trong Python 2.7
Tom

2
Lưu ý rằng %phương pháp thực sự là bị phản đối (bằng Python 3) ủng hộ str.format(): docs.python.org/2/library/stdtypes.html#str.format
dantiston

8
Lưu ý rằng %phương thức này không được khấu hao trong Python 3.6. Nó sẽ tiếp tục được hỗ trợ thay cho sự tương đồng của nó với c, c ++, v.v. str.format()và chuỗi f được ưa thích nhưng không được thi hành.
Aaron

Chỉ cần lưu ý rằng Nếu chuỗi là một chuỗi json, được đọc từ một tệp bạn thậm chí không cần phải thoát %dấu. Chỉ cần %làm
lang thang95

57

Ngoài ra, kể từ Python 2.6, bạn có thể sử dụng định dạng chuỗi mới (được mô tả trong PEP 3101 ):

'Print percent % in sentence and not {0}'.format(test)

Điều này đặc biệt hữu ích khi chuỗi của bạn trở nên phức tạp hơn.


+1, trong khi tôi cho rằng op đang tìm kiếm câu trả lời dựa trên%, tôi rất thích sử dụng formatnhững ngày này.
Nolen Royalty

2
Vấn đề duy nhất với điều này là khi văn bản bạn muốn định dạng là HTML với phần kiểu CSS.
Broseph

Bạn có đề xuất gì cho định dạng văn bản HTML có chứa phần kiểu CSS, @Broseph?
DucRP

1
Tôi đã sai. Nếu bạn sử dụng dấu ngoặc kép trong CSS, bạn vẫn ổn.
Broseph


5

Bạn không thể thoát một cách có chọn lọc %, vì %luôn có một ý nghĩa đặc biệt tùy thuộc vào ký tự sau.

Trong tài liệu về Python, ở phần cuối của bảng thứ hai trong phần đó, nó ghi:

'%'        No argument is converted, results in a '%' character in the result.

Do đó bạn nên sử dụng:

selectiveEscape = "Print percent %% in sentence and not %s" % (test, )

(xin lưu ý thay đổi rõ ràng thành tuple làm đối số %)

Nếu không biết về những điều trên, tôi sẽ làm:

selectiveEscape = "Print percent %s in sentence and not %s" % ('%', test)

với kiến ​​thức rõ ràng bạn đã có.


3

Nếu mẫu định dạng được đọc từ một tệp và bạn không thể đảm bảo nội dung nhân đôi dấu phần trăm, thì có lẽ bạn phải phát hiện ký tự phần trăm và quyết định theo chương trình xem đó có phải là bắt đầu của trình giữ chỗ hay không. Sau đó, trình phân tích cú pháp cũng sẽ nhận ra các chuỗi như %d(và các chữ cái khác có thể được sử dụng), nhưng cũng %(xxx)sv.v.

Vấn đề tương tự có thể được quan sát với các định dạng mới - văn bản có thể chứa dấu ngoặc nhọn.


1

Nếu bạn đang sử dụng Python 3.6 hoặc mới hơn, bạn có thể sử dụng chuỗi f :

>>> test = "have it break."
>>> selectiveEscape = f"Print percent % in sentence and not {test}"
>>> print(selectiveEscape)
... Print percent % in sentence and not have it break.

-3

Tôi đã thử các phương pháp khác nhau để in một tiêu đề phụ, xem cách chúng hoạt động. Nó khác khi tôi sử dụng latex.

Nó hoạt động với '%%' và 'chuỗi' + '%' trong trường hợp điển hình.

Nếu bạn sử dụng latex, nó hoạt động bằng cách sử dụng 'chuỗi' + '\%'

Vì vậy, trong một trường hợp điển hình:

import matplotlib.pyplot as plt
fig,ax = plt.subplots(4,1)
float_number = 4.17
ax[0].set_title('Total: (%1.2f' %float_number + '\%)')
ax[1].set_title('Total: (%1.2f%%)' %float_number)
ax[2].set_title('Total: (%1.2f' %float_number + '%%)')
ax[3].set_title('Total: (%1.2f' %float_number + '%)')

Ví dụ tiêu đề với%

Nếu chúng ta sử dụng latex:

import matplotlib.pyplot as plt
import matplotlib
font = {'family' : 'normal',
        'weight' : 'bold',
        'size'   : 12}
matplotlib.rc('font', **font)
matplotlib.rcParams['text.usetex'] = True
matplotlib.rcParams['text.latex.unicode'] = True
fig,ax = plt.subplots(4,1)
float_number = 4.17
#ax[0].set_title('Total: (%1.2f\%)' %float_number) This makes python crash
ax[1].set_title('Total: (%1.2f%%)' %float_number)
ax[2].set_title('Total: (%1.2f' %float_number + '%%)')
ax[3].set_title('Total: (%1.2f' %float_number + '\%)')

Chúng tôi nhận được điều này: Ví dụ tiêu đề với% và latex

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.