string —一般的な文字列操作—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.8/library/string
移動先:案内検索

string —一般的な文字列操作

ソースコード: :source: `Lib / string.py`



文字列定数

このモジュールで定義されている定数は次のとおりです。

string.ascii_letters
以下で説明する ascii_lowercase 定数と ascii_uppercase 定数の連結。 この値はロケールに依存しません。
string.ascii_lowercase
小文字'abcdefghijklmnopqrstuvwxyz'。 この値はロケールに依存せず、変更されません。
string.ascii_uppercase
大文字'ABCDEFGHIJKLMNOPQRSTUVWXYZ'。 この値はロケールに依存せず、変更されません。
string.digits
文字列'0123456789'
string.hexdigits
文字列'0123456789abcdefABCDEF'
string.octdigits
文字列'01234567'
string.punctuation
Cロケールで句読文字と見なされるASCII文字の文字列:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
string.printable
印刷可能と見なされるASCII文字の文字列。 これは、ASCII_letters句読点、および空白の組み合わせです。
string.whitespace
空白と見なされるすべてのASCII文字を含む文字列。 これには、文字スペース、タブ、改行、リターン、フォームフィード、および垂直タブが含まれます。


カスタム文字列フォーマット

組み込みの文字列クラスは、 PEP 3101 で説明されている format()メソッドを介して複雑な変数の置換と値のフォーマットを行う機能を提供します。 string モジュールの Formatter クラスを使用すると、組み込みの format()メソッドと同じ実装を使用して、独自の文字列フォーマット動作を作成およびカスタマイズできます。

class string.Formatter

Formatter クラスには、次のパブリックメソッドがあります。

format(format_string, /, *args, **kwargs)

主要なAPIメソッド。 これは、フォーマット文字列と、位置引数およびキーワード引数の任意のセットを取ります。 vformat()を呼び出すのは単なるラッパーです。

バージョン3.7で変更:フォーマット文字列引数が位置のみになりました。

vformat(format_string, args, kwargs)

この関数は、フォーマットの実際の作業を行います。 *argsおよび**kwargs構文を使用して辞書を個別の引数としてアンパックおよび再パックするのではなく、事前定義された引数のディクショナリを渡したい場合のために、別個の関数として公開されます。 vformat()は、フォーマット文字列を文字データと置換フィールドに分割する作業を行います。 以下に説明するさまざまなメソッドを呼び出します。

さらに、 Formatter は、サブクラスに置き換えることを目的としたいくつかのメソッドを定義しています。

parse(format_string)

format_stringをループして、反復可能なタプル( literal_textfield_nameformat_specConversion )を返します。 これは、 vformat()によって使用され、文字列をリテラルテキストまたは置換フィールドに分割します。

タプルの値は、概念的には、リテラルテキストのスパンとそれに続く単一の置換フィールドを表します。 リテラルテキストがない場合(2つの置換フィールドが連続して発生する場合に発生する可能性があります)、 literal_text は長さがゼロの文字列になります。 置換フィールドがない場合、 field_nameformat_spec 、および Conversion の値はNoneになります。

get_field(field_name, args, kwargs)

parse()(上記を参照)によって返される field_name を指定して、フォーマットするオブジェクトに変換します。 タプル(obj、used_key)を返します。 デフォルトバージョンは、「0 [name]」や「label.title」など、 PEP 3101 で定義された形式の文字列を取ります。 argskwargs は、 vformat()に渡されたとおりです。 戻り値 used_key は、 get_value()key パラメーターと同じ意味です。

get_value(key, args, kwargs)

指定されたフィールド値を取得します。 key 引数は整数または文字列のいずれかになります。 整数の場合は、 args の位置引数のインデックスを表します。 文字列の場合は、 kwargs の名前付き引数を表します。

args パラメーターは vformat()の位置引数のリストに設定され、 kwargs パラメーターはキーワード引数の辞書に設定されます。

複合フィールド名の場合、これらの関数はフィールド名の最初のコンポーネントに対してのみ呼び出されます。 後続のコンポーネントは、通常の属性およびインデックス作成操作によって処理されます。

したがって、たとえば、フィールド式「0.name」により、 get_value()key 引数0で呼び出されます。 name属性は、組み込みの getattr()関数を呼び出して、 get_value()が戻った後に検索されます。

インデックスまたはキーワードが存在しないアイテムを参照している場合は、 IndexError または KeyError を発生させる必要があります。

check_unused_args(used_args, args, kwargs)

必要に応じて、未使用の引数のチェックを実装します。 この関数の引数は、フォーマット文字列(位置引数の整数、名前付き引数の文字列)で実際に参照されたすべての引数キーのセットであり、引数およびへの参照です。 vformatに渡されたkwargs 。 未使用の引数のセットは、これらのパラメーターから計算できます。 check_unused_args()は、チェックが失敗した場合に例外を発生させると見なされます。

format_field(value, format_spec)

format_field()は、単にグローバル format()ビルトインを呼び出します。 このメソッドは、サブクラスがオーバーライドできるように提供されています。

convert_field(value, conversion)

変換タイプ( parse()メソッドによって返されるタプルのように)を指定して、値( get_field()によって返される)を変換します。 デフォルトバージョンは、「s」(str)、「r」(repr)、および「a」(ascii)変換タイプを理解します。


フォーマット文字列構文

str.format()メソッドと Formatter クラスは、フォーマット文字列に対して同じ構文を共有します(ただし、 Formatter の場合、サブクラスは独自のフォーマットを定義できます)文字列構文)。 構文は形式の文字列リテラルの構文に関連していますが、それほど洗練されておらず、特に任意の式をサポートしていません。

フォーマット文字列には、中括弧{}で囲まれた「置換フィールド」が含まれています。 中括弧に含まれていないものはすべてリテラルテキストと見なされ、変更されずに出力にコピーされます。 リテラルテキストに中括弧文字を含める必要がある場合は、{{}}を2倍にすることでエスケープできます。

置換フィールドの文法は次のとおりです。

  replacement_field ::=  "{" [field_name] ["!" conversion] [":" format_spec] "}"
  field_name        ::=  arg_name ("." attribute_name | "[" element_index "]")*
  arg_name          ::=  [identifier | digit+]
  attribute_name    ::=  identifier
  element_index     ::=  digit+ | index_string
  index_string      ::=  <any source character except "]"> +
 変換        ::=  "r" | "s" | "a"
  format_spec       ::=  <described in the next section>

あまり正式ではありませんが、置換フィールドは、置換フィールドの代わりに値がフォーマットされて出力に挿入されるオブジェクトを指定する field_name で始めることができます。 field_name の後には、オプションで、感嘆符'!'が前に付いた conversion フィールドと、前に付いた format_spec が続きます。コロン':'。 これらは、置換値のデフォルト以外の形式を指定します。

フォーマット仕様ミニ言語セクションも参照してください。

field_name 自体は、数値またはキーワードのいずれかである arg_name で始まります。 数値の場合は位置引数を参照し、キーワードの場合は名前付きキーワード引数を参照します。 フォーマット文字列内の数値arg_namesが0、1、2、…の順序である場合、それらはすべて(一部だけでなく)省略でき、数字0、1、2、…はこの順序で自動的に挿入されます。 arg_name は引用符で区切られていないため、フォーマット文字列内で任意の辞書キー(たとえば、文字列'10'または':-]')を指定することはできません。 arg_name の後には、任意の数のインデックス式または属性式を続けることができます。 '.name'形式の式は、 getattr()を使用して名前付き属性を選択し、'[index]'形式の式は、__getitem__()を使用してインデックスルックアップを実行します。

バージョン3.1で変更: str.format()の位置引数指定子は省略できるため、'{} {}'.format(a, b)'{0} {1}'.format(a, b)と同等です。


バージョン3.4で変更: Formatter の位置引数指定子は省略できます。


いくつかの単純なフォーマット文字列の例:

"First, thou shalt count to {0}"  # References first positional argument
"Bring me a {}"                   # Implicitly references the first positional argument
"From {} to {}"                   # Same as "From {0} to {1}"
"My quest is {name}"              # References keyword argument 'name'
"Weight in tons {0.weight}"       # 'weight' attribute of first positional arg
"Units destroyed: {players[0]}"   # First element of keyword argument 'players'.

Conversion フィールドは、フォーマットする前に型強制を引き起こします。 通常、値をフォーマットする作業は、値自体の__format__()メソッドによって実行されます。 ただし、場合によっては、型を文字列として強制的にフォーマットし、それ自体のフォーマットの定義をオーバーライドすることが望ましい場合があります。 __format__()を呼び出す前に値を文字列に変換することにより、通常のフォーマットロジックがバイパスされます。

現在、3つの変換フラグがサポートされています。値に対して str()を呼び出す'!s'repr()および [を呼び出す'!r'です。 ascii()を呼び出すX145X]。

いくつかの例:

"Harold's a clever {0!s}"        # Calls str() on the argument first
"Bring out the holy {name!r}"    # Calls repr() on the argument first
"More {!a}"                      # Calls ascii() on the argument first

format_spec フィールドには、フィールド幅、配置、パディング、小数精度などの詳細を含む、値の表示方法の仕様が含まれています。 各値型は、独自の「フォーマットミニ言語」または format_spec の解釈を定義できます。

ほとんどの組み込み型は、次のセクションで説明する一般的なフォーマットのミニ言語をサポートしています。

format_spec フィールドには、ネストされた置換フィールドを含めることもできます。 これらのネストされた置換フィールドには、フィールド名、変換フラグ、およびフォーマット指定が含まれる場合がありますが、より深いネストは許可されていません。 format_spec内の置換フィールドは、 format_spec 文字列が解釈される前に置換されます。 これにより、値のフォーマットを動的に指定できます。

いくつかの例については、フォーマットの例セクションを参照してください。

フォーマット仕様ミニランゲージ

「フォーマット仕様」は、フォーマット文字列内に含まれる置換フィールド内で使用され、個々の値の表示方法を定義します(フォーマット文字列構文およびフォーマットされた文字列リテラルを参照)。 また、組み込みの format()関数に直接渡すこともできます。 各フォーマット可能タイプは、フォーマット仕様の解釈方法を定義できます。

ほとんどの組み込み型は、フォーマット仕様に対して次のオプションを実装していますが、一部のフォーマットオプションは数値型でのみサポートされています。

一般的な規則では、空の形式の指定では、値に対して str()を呼び出した場合と同じ結果が生成されます。 空でないフォーマット仕様は、通常、結果を変更します。

標準フォーマット指定子の一般的な形式は次のとおりです。

format_spec     ::=  [[fill]align][sign][#][0][width][grouping_option][.precision][type]
 塗りつぶし            ::=  <any character>
  align           ::=  "<" | ">" | "=" | "^"
 サイン            ::=  "+" | "-" | " "
 幅           ::=  digit+
  grouping_option ::=  "_" | ","
 精度       ::=  digit+
 タイプ            ::=  "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"

有効な align 値を指定すると、その前に fill 文字を付けることができます。この文字は任意の文字で、省略した場合はデフォルトでスペースになります。 形式の文字列リテラル塗りつぶし文字としてリテラル中括弧(「{」または「}」)を使用することはできません。または str.format()メソッドを使用する場合。 ただし、ネストされた置換フィールドを使用して中括弧を挿入することは可能です。 この制限は、 format()関数には影響しません。

さまざまな配置オプションの意味は次のとおりです。

オプション 意味
'<' 使用可能なスペース内でフィールドを強制的に左揃えにします(これはほとんどのオブジェクトのデフォルトです)。
'>' 使用可能なスペース内でフィールドを強制的に右揃えにします(これは数値のデフォルトです)。
'=' 記号(ある場合)の後、数字の前にパディングを強制的に配置します。 これは、「+ 000000120」の形式でフィールドを印刷するために使用されます。 この配置オプションは、数値型にのみ有効です。 「0」がフィールド幅の直前にある場合、これがデフォルトになります。
'^' フィールドを強制的に使用可能なスペースの中央に配置します。


最小フィールド幅が定義されていない限り、フィールド幅は常にそれを埋めるためのデータと同じサイズになるため、この場合、配置オプションは意味をなさないことに注意してください。

sign オプションは数値タイプにのみ有効であり、次のいずれかになります。

オプション 意味
'+' 正の数と負の数の両方に符号を使用する必要があることを示します。
'-' 符号は負の数にのみ使用する必要があることを示します(これがデフォルトの動作です)。
スペース 正の数には先頭のスペースを使用し、負の数にはマイナス記号を使用する必要があることを示します。


'#'オプションを使用すると、「代替形式」が変換に使用されます。 代替形式は、タイプごとに定義が異なります。 このオプションは、整数型、浮動小数点型、および複合型にのみ有効です。 整数の場合、2進数、8進数、または16進数の出力が使用されると、このオプションは、それぞれ'0b''0o'、または'0x'のプレフィックスを出力値に追加します。 floatおよびcomplexの場合、代替形式を使用すると、数字が続かない場合でも、変換の結果には常に小数点文字が含まれます。 通常、これらの変換の結果には、数字が続く場合にのみ小数点文字が表示されます。 さらに、'g'および'G'変換の場合、末尾のゼロは結果から削除されません。

','オプションは、千単位の区切り文字にコンマを使用することを示します。 ロケール対応の区切り文字の場合は、代わりに'n'整数表示タイプを使用してください。

バージョン3.1で変更: ','オプションが追加されました( PEP 378 も参照)。


'_'オプションは、浮動小数点表示タイプおよび整数表示タイプ'd'の千単位の区切り文字にアンダースコアを使用することを示します。 整数表示タイプ'b''o''x'、および'X'の場合、4桁ごとにアンダースコアが挿入されます。 他の種類のプレゼンテーションの場合、このオプションを指定するとエラーになります。

バージョン3.6で変更: '_'オプションが追加されました( PEP 515 も参照)。


width は、プレフィックス、区切り文字、その他の書式設定文字を含む、最小合計フィールド幅を定義する10進整数です。 指定しない場合、フィールド幅はコンテンツによって決定されます。

明示的な配置が指定されていない場合、 width フィールドの前にゼロ('0')文字を付けると、数値型の符号対応ゼロパディングが有効になります。 これは、アライメントタイプが'=''0'塗りつぶし文字に相当します。

precision は、'f'および'F'でフォーマットされた浮動小数点値の小数点以下、または小数点の前後に表示する桁数を示す10進数です。 'g'または'G'でフォーマットされた浮動小数点値のポイント。 数値以外のタイプの場合、フィールドは最大フィールドサイズを示します。つまり、フィールドの内容から使用される文字数を示します。 precision は整数値には使用できません。

最後に、 type は、データの表示方法を決定します。

使用可能な文字列表示タイプは次のとおりです。

タイプ 意味
's' 文字列形式。 これは文字列のデフォルトタイプであり、省略できます。
なし 's'と同じです。


使用可能な整数表示タイプは次のとおりです。

タイプ 意味
'b' バイナリ形式。 2を底とする数値を出力します。
'c' キャラクター。 印刷する前に、整数を対応するUnicode文字に変換します。
'd' 10進整数。 基数10の数値を出力します。
'o' 8進数形式。 基数8の数値を出力します。
'x' 16進形式。 9を超える桁には小文字を使用して、基数16の数値を出力します。
'X' 16進形式。 9を超える数字に大文字を使用して、基数16の数値を出力します。
'n' 番号。 これは'd'と同じですが、現在のロケール設定を使用して適切な数字の区切り文字を挿入する点が異なります。
なし 'd'と同じです。


上記の表示タイプに加えて、整数は以下にリストされている浮動小数点表示タイプでフォーマットできます('n'およびNoneを除く)。 その際、 float()を使用して、フォーマットする前に整数を浮動小数点数に変換します。

float および Decimal 値で使用可能な表示タイプは次のとおりです。

タイプ 意味
'e' 科学的記数法。 与えられた精度pに対して、係数を指数から分離する文字「e」で数値を科学的記数法でフォーマットします。 係数は、小数点の前に1桁、小数点の後にp桁あり、合計でp + 1有効桁になります。 精度が指定されていない場合、 float の小数点以下6桁の精度を使用し、 Decimal のすべての係数桁を表示します。 小数点以下の桁がない場合は、#オプションを使用しない限り、小数点も削除されます。
'E' 科学的記数法。 'e'と同じですが、区切り文字として大文字の「E」を使用する点が異なります。
'f' 固定小数点表記。 指定された精度pに対して、数値を小数点以下の正確なp桁の10進数としてフォーマットします。 精度が指定されていない場合、 float の小数点以下の6桁の精度を使用し、 Decimal のすべての係数桁を表示するのに十分な大きさの精度を使用します。 小数点以下の桁がない場合は、#オプションを使用しない限り、小数点も削除されます。
'F' 固定小数点表記。 'f'と同じですが、nanNANに、infINFに変換します。
'g'

一般的な形式。 与えられた精度p >= 1の場合、これは数値をp有効数字に丸め、その大きさに応じて固定小数点形式または科学的記数法のいずれかで結果をフォーマットします。 0の精度は、1の精度と同等として扱われます。

正確なルールは次のとおりです。プレゼンテーションタイプ'e'および精度p-1でフォーマットされた結果は、指数expを持つと仮定します。 次に、m <= exp < pmは浮動小数点数の場合は-4、小数の場合は-6)の場合、数値は表示タイプ'f'および精度[ X154X] 。 それ以外の場合、数値は表示タイプ'e'および精度p-1でフォーマットされます。 どちらの場合も、'#'オプションが使用されていない限り、重要でない後続ゼロが仮数から削除され、それに続く数字が残っていない場合は小数点も削除されます。

精度が指定されていない場合、 float には6有効数字の精度を使用します。 Decimal の場合、結果の係数は値の係数桁から形成されます。 絶対値が1e-6より小さい値、および最下位桁の桁の値が1より大きい値には科学的記数法が使用され、それ以外の場合は固定小数点表記が使用されます。

正と負の無限大、正と負のゼロ、およびnansは、inf-inf0-0、およびnanの形式になります。それぞれ、精度に関係なく。

'G' 一般的な形式。 'g'と同じですが、数値が大きくなりすぎると'E'に切り替わります。 無限大とNaNの表現も大文字になっています。
'n' 番号。 これは'g'と同じですが、現在のロケール設定を使用して適切な数字の区切り文字を挿入する点が異なります。
'%' パーセンテージ。 数値に100を掛けて、固定('f')形式で表示し、その後にパーセント記号を付けます。
なし

float の場合、これは'g'と同じですが、固定小数点表記を使用して結果をフォーマットする場合、常に小数点以下1桁が含まれる点が異なります。 使用される精度は、指定された値を忠実に表すために必要なだけ大きくなります。

Decimal の場合、これは、現在の10進数コンテキストのcontext.capitalsの値に応じて、'g'または'G'のいずれかと同じです。

全体的な効果は、他のフォーマット修飾子によって変更された str()の出力と一致することです。


フォーマット例

このセクションには、 str.format()構文の例と、古い%フォーマットとの比較が含まれています。

ほとんどの場合、構文は古い%形式と似ていますが、{}が追加され、%の代わりに:が使用されます。 たとえば、'%03.2f''{:03.2f}'に変換できます。

新しいフォーマット構文は、次の例に示すように、新しいさまざまなオプションもサポートします。

位置による引数へのアクセス:

>>> '{0}, {1}, {2}'.format('a', 'b', 'c')
'a, b, c'
>>> '{}, {}, {}'.format('a', 'b', 'c')  # 3.1+ only
'a, b, c'
>>> '{2}, {1}, {0}'.format('a', 'b', 'c')
'c, b, a'
>>> '{2}, {1}, {0}'.format(*'abc')      # unpacking argument sequence
'c, b, a'
>>> '{0}{1}{0}'.format('abra', 'cad')   # arguments' indices can be repeated
'abracadabra'

名前による引数へのアクセス:

>>> 'Coordinates: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-115.81W')
'Coordinates: 37.24N, -115.81W'
>>> coord = {'latitude': '37.24N', 'longitude': '-115.81W'}
>>> 'Coordinates: {latitude}, {longitude}'.format(**coord)
'Coordinates: 37.24N, -115.81W'

引数の属性へのアクセス:

>>> c = 3-5j
>>> ('The complex number {0} is formed from the real part {0.real} '
...  'and the imaginary part {0.imag}.').format(c)
'The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0.'
>>> class Point:
...     def __init__(self, x, y):
...         self.x, self.y = x, y
...     def __str__(self):
...         return 'Point({self.x}, {self.y})'.format(self=self)
...
>>> str(Point(4, 2))
'Point(4, 2)'

引数の項目へのアクセス:

>>> coord = (3, 5)
>>> 'X: {0[0]};  Y: {0[1]}'.format(coord)
'X: 3;  Y: 5'

%s%rの交換:

>>> "repr() shows quotes: {!r}; str() doesn't: {!s}".format('test1', 'test2')
"repr() shows quotes: 'test1'; str() doesn't: test2"

テキストの配置と幅の指定:

>>> '{:<30}'.format('left aligned')
'left aligned                  '
>>> '{:>30}'.format('right aligned')
'                 right aligned'
>>> '{:^30}'.format('centered')
'           centered           '
>>> '{:*^30}'.format('centered')  # use '*' as a fill char
'***********centered***********'

%+f%-f、および% fを置き換えて、符号を指定します。

>>> '{:+f}; {:+f}'.format(3.14, -3.14)  # show it always
'+3.140000; -3.140000'
>>> '{: f}; {: f}'.format(3.14, -3.14)  # show a space for positive numbers
' 3.140000; -3.140000'
>>> '{:-f}; {:-f}'.format(3.14, -3.14)  # show only the minus -- same as '{:f}; {:f}'
'3.140000; -3.140000'

%x%oを置き換え、値を別の基数に変換します。

>>> # format also supports binary numbers
>>> "int: {0:d};  hex: {0:x};  oct: {0:o};  bin: {0:b}".format(42)
'int: 42;  hex: 2a;  oct: 52;  bin: 101010'
>>> # with 0x, 0o, or 0b as prefix:
>>> "int: {0:d};  hex: {0:#x};  oct: {0:#o};  bin: {0:#b}".format(42)
'int: 42;  hex: 0x2a;  oct: 0o52;  bin: 0b101010'

カンマを千単位の区切り文字として使用する:

>>> '{:,}'.format(1234567890)
'1,234,567,890'

パーセンテージの表現:

>>> points = 19
>>> total = 22
>>> 'Correct answers: {:.2%}'.format(points/total)
'Correct answers: 86.36%'

タイプ固有のフォーマットの使用:

>>> import datetime
>>> d = datetime.datetime(2010, 7, 4, 12, 15, 58)
>>> '{:%Y-%m-%d %H:%M:%S}'.format(d)
'2010-07-04 12:15:58'

ネスト引数とより複雑な例:

>>> for align, text in zip('<^>', ['left', 'center', 'right']):
...     '{0:{fill}{align}16}'.format(text, fill=align, align=align)
...
'left<<<<<<<<<<<<'
'^^^^^center^^^^^'
'>>>>>>>>>>>right'
>>>
>>> octets = [192, 168, 0, 1]
>>> '{:02X}{:02X}{:02X}{:02X}'.format(*octets)
'C0A80001'
>>> int(_, 16)
3232235521
>>>
>>> width = 5
>>> for num in range(5,12): 
...     for base in 'dXob':
...         print('{0:{width}{base}}'.format(num, base=base, width=width), end=' ')
...     print()
...
    5     5     5   101
    6     6     6   110
    7     7     7   111
    8     8    10  1000
    9     9    11  1001
   10     A    12  1010
   11     B    13  1011

テンプレート文字列

テンプレート文字列は、 PEP 292 で説明されているように、より単純な文字列置換を提供します。 テンプレート文字列の主な使用例は国際化(i18n)です。これは、そのコンテキストでは、構文と機能が単純なため、Pythonの他の組み込み文字列フォーマット機能よりも翻訳が容易になるためです。 i18nのテンプレート文字列に基づいて構築されたライブラリの例として、 flufl.i18n パッケージを参照してください。

テンプレート文字列は、次のルールを使用して、$ベースの置換をサポートします。

  • $$はエスケープです。 単一の$に置き換えられます。
  • $identifierは、"identifier"のマッピングキーに一致する置換プレースホルダーに名前を付けます。 デフォルトでは、"identifier"は、アンダースコアまたはASCII文字で始まる大文字と小文字を区別しないASCII英数字文字列(アンダースコアを含む)に制限されています。 $文字の後の最初の非識別子文字は、このプレースホルダー指定を終了します。
  • ${identifier}$identifierと同等です。 "${noun}ification"のように、有効な識別子文字がプレースホルダーの後に続くが、プレースホルダーの一部ではない場合に必要です。

文字列に$が含まれていると、 ValueError が発生します。

string モジュールは、これらのルールを実装する Template クラスを提供します。 テンプレートのメソッドは次のとおりです。

class string.Template(template)

コンストラクターは、テンプレート文字列である単一の引数を取ります。

substitute(mapping={}, /, **kwds)

テンプレートの置換を実行し、新しい文字列を返します。 mapping は、テンプレート内のプレースホルダーと一致するキーを持つ辞書のようなオブジェクトです。 または、キーワードがプレースホルダーであるキーワード引数を指定することもできます。 マッピングkwds の両方が指定され、重複がある場合、 kwds のプレースホルダーが優先されます。

safe_substitute(mapping={}, /, **kwds)

代替()と同様ですが、マッピングおよび kwds にプレースホルダーがない場合、 KeyError 例外を発生させる代わりに、元のプレースホルダーを使用します。結果の文字列にはそのまま表示されます。 また、 replace()とは異なり、$の他の外観は、 ValueError を発生させる代わりに、単に$を返します。

他の例外が発生する可能性はありますが、このメソッドは、例外を発生させるのではなく、常に使用可能な文字列を返そうとするため、「安全」と呼ばれます。 別の意味では、 safe_substitute()は、ぶら下がっている区切り文字、一致しない中括弧、または有効なPython識別子ではないプレースホルダーを含む不正な形式のテンプレートを黙って無視するため、安全以外の何かである可能性があります。

Template インスタンスは、次の1つのパブリックデータ属性も提供します。

template

これは、コンストラクターの template 引数に渡されるオブジェクトです。 通常、変更しないでください。ただし、読み取り専用アクセスは強制されません。

テンプレートの使用方法の例を次に示します。

>>> from string import Template
>>> s = Template('$who likes $what')
>>> s.substitute(who='tim', what='kung pao')
'tim likes kung pao'
>>> d = dict(who='tim')
>>> Template('Give $who $100').substitute(d)
Traceback (most recent call last):
...
ValueError: Invalid placeholder in string: line 1, col 11
>>> Template('$who likes $what').substitute(d)
Traceback (most recent call last):
...
KeyError: 'what'
>>> Template('$who likes $what').safe_substitute(d)
'tim likes $what'

高度な使用法: Template のサブクラスを派生させて、プレースホルダー構文、区切り文字、またはテンプレート文字列の解析に使用される正規表現全体をカスタマイズできます。 これを行うには、次のクラス属性をオーバーライドできます。

  • delimiter –これは区切り文字を導入するプレースホルダーを説明するリテラル文字列です。 デフォルト値は$です。 実装は必要に応じてこの文字列で re.escape()を呼び出すため、これは正規表現ではなくである必要があることに注意してください。 さらに、クラスの作成後に区切り文字を変更することはできないことに注意してください(つまり、 サブクラスのクラス名前空間に別の区切り文字を設定する必要があります)。

  • idpattern –これはブレースなしのプレースホルダーのパターンを説明する正規表現です。 デフォルト値は正規表現(?a:[_a-z][_a-z0-9]*)です。 これが指定され、 braceidpatternNoneの場合、このパターンはブレース付きプレースホルダーにも適用されます。

    ノート

    デフォルトのフラグre.IGNORECASEであるため、パターン[a-z]は一部の非ASCII文字と一致する可能性があります。 そのため、ここではローカルのaフラグを使用します。

    バージョン3.7で変更: braceidpattern を使用して、中括弧の内側と外側で使用される個別のパターンを定義できます。

  • braceidpattern –これは idpattern に似ていますが、ブレース付きプレースホルダーのパターンを説明しています。 デフォルトはNoneです。これは、 idpattern にフォールバックすることを意味します(つまり、 同じパターンが内側と外側の両方のブレースに使用されます)。 指定した場合、これにより、ブレース付きプレースホルダーとブレースなしプレースホルダーに異なるパターンを定義できます。

    バージョン3.7の新機能。

  • flags –置換の認識に使用される正規表現をコンパイルするときに適用される正規表現フラグ。 デフォルト値はre.IGNORECASEです。 re.VERBOSEは常にフラグに追加されるため、カスタム idpattern は、詳細な正規表現の規則に従う必要があることに注意してください。

    バージョン3.2の新機能。

または、クラス属性 pattern をオーバーライドして、正規表現パターン全体を提供することもできます。 これを行う場合、値は4つの名前付きキャプチャグループを持つ正規表現オブジェクトである必要があります。 キャプチャグループは、無効なプレースホルダールールとともに、上記のルールに対応しています。

  • escaped –このグループはエスケープシーケンスに一致します。例: $$、デフォルトのパターン。
  • 名前付き –このグループは、括弧で囲まれていないプレースホルダー名と一致します。 キャプチャグループに区切り文字を含めないでください。
  • braced –このグループは、中括弧で囲まれたプレースホルダー名と一致します。 キャプチャグループに区切り文字または中括弧を含めないでください。
  • invalid –このグループは、他の区切り文字パターン(通常は単一の区切り文字)と一致し、正規表現の最後に表示されます。


ヘルパー関数

string.capwords(s, sep=None)
str.split()を使用して引数を単語に分割し、 str.capitalize()を使用して各単語を大文字にし、 str.join()を使用して大文字の単語を結合します。 ]。 オプションの2番目の引数 sep がないかNoneの場合、空白文字の実行は単一のスペースに置き換えられ、先頭と末尾の空白が削除されます。それ以外の場合は、 sep が使用されます。単語を分割して結合します。