Python 標準ライブラリ string 文字列の操作
Publish date: 2021-03-26
Pythonの標準にある文字列操作を行うためのstringモジュールについて解説します。
stringの概要
stringモジュールには基本的な文字列操作で使えるいくつかの定数と、 カスタム書式のフォーマットのためのクラスFormatter、 簡易的なテンプレートエンジンとしてつかえるTemplateクラスが定義されています。
stringの定数
アスキー文字や数字等の特定クラスの文字種がまとめられています。 アスキー文字は大文字・小文字・その両方の3つがあります。
import string
string.ascii_lowercase # => 'abcdefghijklmnopqrstuvwxyz'
string.ascii_uppercase # => 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
string.ascii_letters # => 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
数字は、8・10・16進数用の文字種が定義されています。
string.digits # => '0123456789'
string.hexdigits # => '0123456789abcdefABCDEF'
string.octdigits # => '01234567'
やや特殊なものとしては以下があります。
# 句読点、文字の区切りの類
string.punctuation # => '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
# 印字可能な文字
string.printable
# => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c'
# スペースや改行
string.whitespace # => ' \t\n\r\x0b\x0c'
Formatterクラス カスタム書式のフォーマット
str.format と同様の文字列フォーマット機能とそのカスタマイズを提供するFormatterクラスが定義されています。
以下は文字列のformatメソッドと同様の文字列を取得する例です。
from string import Formatter
f = Formatter()
args = [1, 'a']
kwargs = {'s':'XYZ', 'n':1.2}
f.vformat('{0}, {1}, {s}, {n}', args, kwargs) # => '1, a, XYZ, 1.2'
f.format('{0}, {1}, {s}, {n}', 1 , 'a', s='XYZ', n=1.2) # => '1, a, XYZ, 1.2'
f.format('{0}, {1}, {s}, {n}', *args , **kwargs) # => '1, a, XYZ, 1.2'
Templateクラス 標準のテンプレートエンジン
文字列置換の機能をもった簡易的なテンプレートエンジンとして使えるPython標準のクラスです。
Template(文字列)
で置換対象元となるテンプレート文字列を指定し、
Templateのインスタンスを生成できます。
テンプレートの変数は先頭にドルマーク$
を付与して記載します。
from string import Template
t = Template('<$tag>$body</$tag>')
変数置換を適用した出力結果の文字列はsubstitute
メソッドに
辞書dict、あるいはキーワードで変数を指定することで得られます。
t.substitute(tag="p", body='abcde') # => '<p>abcde</p>'
t.substitute({'tag':'p', 'body':'abcd'}) # => '<p>abcd</p>'
t.substitute({'tag':'p'}, body='abcd') # => '<p>abcd</p>'
テンプレート内に存在する変数で、substitute
で指定されないものがあるとエラーが発生します。
t.substitute(tag='p', b='XYZ') # => KeyError: 'body'
代わりにsafe_substitute
を使うとエラーは発生せず、変数名のまま出力が行われます。
t.safe_substitute(tag='p', b='XYZ') # => '<p>$body</p>'
単語の先頭大文字化
stringには単語の先頭を大文字にする関数も定義されています。
string.capwords("this is a pen.") # => 'This Is A Pen.'