2.5. 文字列メソッドとフォーマット

文字列には、検査と再形成のためのメソッドが組み込みのツールボックスとして付属しています。文字列はイミュータブルであるため、すべてのメソッドは 新しい 文字列を返し、元の文字列は変更されません。

2.5.1. 文字列の検査

  • str.startswith() / str.endswith() -- 接頭辞または接尾辞のテスト。bool を返します。

  • str.find() -- 部分文字列が最初に出現する位置、存在しない場合は -1 を返します。str.index() は同じことを行いますが、存在しない場合は ValueError を発生させます。

  • str.count() -- 重複しない出現回数。

  • in キーワード -- 部分文字列が文字列のどこかにあれば "MV" in nameTrue を返します。

>>> 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 のフォーマット仕様と同じ仕事をしますが、変換した文字列を直接返します:

  • bin() -- 2 進数、"0b" 接頭辞付き。

  • oct() -- 8 進数、"0o" 接頭辞付き。

  • hex() -- 16 進数、"0x" 接頭辞付き。

>>> 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文字列を使い、既存のコードを読む際に古い形式を認識できるようにしてください。