2.5. 文字列メソッドとフォーマット¶
文字列には、検査と再形成のためのメソッドが組み込みのツールボックスとして付属しています。文字列はイミュータブルであるため、すべてのメソッドは 新しい 文字列を返し、元の文字列は変更されません。
2.5.1. 文字列の検査¶
str.startswith()/str.endswith()-- 接頭辞または接尾辞のテスト。boolを返します。str.find()-- 部分文字列が最初に出現する位置、存在しない場合は-1を返します。str.index()は同じことを行いますが、存在しない場合はValueErrorを発生させます。str.count()-- 重複しない出現回数。inキーワード -- 部分文字列が文字列のどこかにあれば"MV" in nameはTrueを返します。
>>> name = "OpenMV Cam"
>>> name.startswith("Open")
True
>>> name.find("MV")
4
>>> name.count("m")
1
>>> "Cam" in name
True
2.5.2. クリーニングと大文字小文字¶
str.strip()-- 先頭と末尾の空白を削除します。文字の並びを渡すと、独自の集合を取り除けます(s.strip("/"))。str.lower()/str.upper()-- 大文字小文字の変換。str.replace()-- 部分文字列の置換。
>>> " hello ".strip()
'hello'
>>> "abc-123".replace("-", "_")
'abc_123'
>>> "OpenMV".lower()
'openmv'
2.5.3. 分割と結合¶
str.split()-- 区切り文字が出現するたびに文字列をリストへ分割します(デフォルト: 任意の空白の連続)。str.join()-- その逆で、文字列のシーケンスをレシーバを区切り文字として連結します。これは複数の断片から長い文字列を構築する効率的な方法です。
>>> "1,2,3".split(",")
['1', '2', '3']
>>> "hello world".split()
['hello', 'world']
>>> ", ".join(["a", "b", "c"])
'a, b, c'
2.5.4. f文字列¶
値を文字列に補間する最も簡単な方法は f文字列 で、f を接頭辞に付けた文字列リテラルです。{} の中の任意の式が評価されて挿入されます:
>>> name = "OpenMV"
>>> count = 42
>>> f"{name} saw {count} blobs"
'OpenMV saw 42 blobs'
波括弧の中のコロンは、値の表示方法を制御する フォーマット仕様 を導入します:
{x:.2f}-- 小数点以下 2 桁の浮動小数点数。{x:>10}-- 10 文字幅のフィールドで右寄せ。{x:<10}-- 左寄せ。{x:0>4}-- 先頭にゼロを詰めて幅 4 にします。{x:#x}--0x接頭辞付きの 16 進数。{x:b}-- 2 進数表現。
>>> f"pi is roughly {3.14159:.3f}"
'pi is roughly 3.142'
>>> f"reg = {0xAB:#x}"
'reg = 0xab'
>>> for i in range(3):
... print(f"line {i:0>3}")
line 000
line 001
line 002
式名の後ろに単一の = を付けると、名前と値の両方が出力されます。手早いデバッグ出力に便利です:
>>> v = 3.14
>>> print(f"{v=}")
v=3.14
2.5.4.1. 整数の基数変換¶
3 つの組み込み関数は :b / :o / :x のフォーマット仕様と同じ仕事をしますが、変換した文字列を直接返します:
>>> hex(255)
'0xff'
>>> bin(10)
'0b1010'
>>> oct(8)
'0o10'
逆方向、つまり N 進数の文字列を整数に戻すには、明示的な基数を指定した int コンストラクタを使います:
>>> int("ff", 16)
255
>>> int("0b1010", 2) # the "0b" prefix is allowed
10
整数の生の文字列が欲しいとき(ログ行、設定ファイル、レジスタダンプなど)はこれらを使ってください。詰め物、幅、または同じ f文字列の中で値を他のテキストと混ぜたいときはフォーマット仕様を使ってください。
2.5.5. 古いフォーマットスタイル¶
f文字列が推奨されるスタイルですが、2 つの古い方法も依然として機能し、既存のコードに現れます:
str.format() -- テンプレート文字列の .format() メソッドに渡された位置引数またはキーワード引数を伴う波括弧:
>>> "Hello, {}".format(name)
'Hello, OpenMV'
>>> "{0} + {0} = {1}".format(2, 4)
'2 + 2 = 4'
>>> "{name}: {value}".format(name="frames", value=42)
'frames: 42'
フォーマット仕様({:.2f}、{:>10}、...)は f文字列と同じように機能します。唯一の違いは値が どこで 供給されるかです。
% フォーマット(printf スタイル) -- 単一の % 演算子がフォーマットコードに値を 1 コードにつき 1 値で代入します。複数の値はタプルとして渡します:
>>> "Hello, %s" % name
'Hello, OpenMV'
>>> "%d + %d = %d" % (2, 2, 4)
'2 + 2 = 4'
>>> "%.2f" % 3.14159
'3.14'
最も一般的な型コードは %s(文字列)、%d(整数)、%f(浮動小数点数)、%x(16 進数)です。
各 % コードは % と型を表す文字の間に修飾子を持てます。完全な形は %[flags][width][.precision]type です:
width -- フィールドが占めなければならない最小の文字数。短い値はスペースで詰められ、長い値はあふれます。
%10dは 10 文字を確保して数値を右寄せします。precision -- 意味は型によって異なります。浮動小数点数では小数点以下の桁数です。
%.2fは小数点以下 2 桁を与えます。文字列では取得する最大文字数です(%.5sは 5 文字に切り詰めます)。左寄せ --
-フラグはフィールドを左に置きます。%-10dは数字を左側に置き、後ろにスペースを付けます。ゼロ詰め --
0フラグはスペースの代わりに先頭にゼロを詰めます(数値型の場合)。%05dは 5 桁にゼロ詰めします。符号 --
+フラグは数値に常に符号を表示し、正の数には+を付けます。別形式 --
#フラグです。%xではこれが出力に0xを前置し、%oでは0oを前置します。
フラグ、幅、精度は組み合わせられます:
>>> "%10d" % 42
' 42' # width 10, space-padded, right-aligned
>>> "%-10d|" % 42
'42 |' # width 10, left-aligned
>>> "%05d" % 42
'00042' # width 5, zero-padded
>>> "%8.2f" % 3.14159
' 3.14' # width 8, 2 decimal places
>>> "%08.2f" % 3.14159
'00003.14' # width 8, zero-padded
>>> "%+d" % 42
'+42' # explicit sign
>>> "%#06x" % 0xAB
'0x00ab' # 0x prefix, zero-pad to 6 chars total
どちらの古いスタイルも f文字列より読みにくく、間違えやすいものです。新しいコードでは f文字列を使い、既存のコードを読む際に古い形式を認識できるようにしてください。