Python文字列でパーセント(%)を選択的にエスケープするにはどうすればよいですか?


364

次のコードがあります

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

print(selectiveEscape)

出力を取得したいと思います:

Print percent % in sentence and not have it break.

実際に起こること:

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

57
どうしてじゃないの\%?それは私の推測でした、%%代わりにそれを見つけて驚いています-かなり直観に反するようです。
Demis 2015

3
% i手段「整数の小数表現、スペースで左パディング。
アンティHaapala

3
エスケープは関数に対するものであり、言語構文に対するものではありません。したがって、エスケープが通常のコードで書かれた場合、\%それは実際にエスケープさ\\%れます。 <escape><escape>私が見た典型的なパターン\であり、良くも悪くも、最も一般的なエスケープ文字です。
-shemnon

1
@Demisと\ 、印刷しなければならなかった場合、どうやってエスケープします\\%か?特殊文字も状況に応じて特殊でない場合は、特殊文字の繰り返しによるエスケープが必要になります。
サッサNF

2
Pythonでは、リテラル%が「\%」ではなく「%%」でエンコードされているのは厄介だと思います。
MasterControlProgram

回答:


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
Python 3.3.5では、をprint('%s%%' % 100)出力し100%ます。しかし、print('%%')プリント%%。したがって、置換を行わない場合、%記号をエスケープする必要がないように見えます。
Zenadix

5
@ZenadixこれはPython 2.7にも当てはまります
Tom

2
この%メソッドは実際には非推奨である(Python 3では)str.format()docs.python.org/2/library/stdtypes.html#str.format
dantiston

8
この%メソッドはPython 3.6では廃止されていないことに注意してください。c、c ++などstr.format()との類似性の代わりに引き続きサポートされ、f文字列が推奨されますが、強制されません。
アーロン

文字列がjson文字列である場合、ファイルから読み取られるので、%記号をエスケープする必要すらないことにも注意してください。Just %will do
wander95 '19

57

または、Python 2.6以降では、新しい文字列フォーマットを使用できます(PEP 3101で説明)。

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

文字列が複雑になるので特に便利です。


+1、私はopが%ベースの回答を探していると考えていたが、format最近は使用したい。
ノーレンロイヤルティ

2
これに関する唯一の問題は、フォーマットしたいテキストがCSSスタイルセクションのあるHTMLである場合です。
Broseph 2014

CSSスタイルセクション@Brosephを含むテキストフォーマットHTMLには何をお勧めしますか?
DucRP 2015年

1
私は間違っていた。CSSで二重ブレースを使用している場合は問題ありません。
Broseph


5

常に次の文字に応じて特別な意味があるため%、選択的にエスケープすることはできません%

Python のドキュメントでは、そのセクションの2番目のテーブルの下部に、次のように記載されています。

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

したがって、以下を使用する必要があります。

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

(への引数としてタプルへの明示的な変更に注意してください%

上記について知らなければ、私はそうしたでしょう:

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

あなたがすでに持っていた知識で


3

書式設定テンプレートがファイルから読み取られ、コンテンツがパーセント記号を2倍にすることを保証できない場合は、おそらくパーセント文字を検出し、それがプレースホルダーの開始かどうかをプログラムで決定する必要があります。次に、パーサーは%d(および使用できる他の文字)のようなシーケンスだけでなく、その他も認識する必要があります%(xxx)s

新しいフォーマットでも同様の問題が見られます。テキストには中括弧が含まれている可能性があります。


1

あなたが使用している場合はPython 3.6以降を、あなたが使用することができ、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

サブプロットのタイトルを印刷するためにさまざまな方法を試しましたが、それらがどのように機能するかを見てください。ラテックスを使うと違います。

典型的なケースでは、「%%」と「string」+「%」で機能します。

ラテックスを使用する場合は、 'string' + '\%'を使用して機能しました

だから典型的なケースでは:

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 + '%)')

%を含むタイトルの例

ラテックスを使用する場合:

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 + '\%)')

これが得られます: %とlatexを使用したタイトルの例

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.