HOWTO · Python
Python で文字列の文字を置き換える
Python の文字列で、位置を指定して 1 文字を置き換える方法や、一致する文字を置き換える方法を学びます。
このページの内容
Pythonの文字列は不変なので、既存の文字列に新しい文字を直接代入することはできません。変更した値から新しい文字列を作成します。1か所を編集するならリスト、該当する文字列を置き換えるなら replace()、位置が分かっているならスライスを使います。bytearray() は ASCII などのバイト単位で扱うデータに適していますが、インデックスが指すのは一般的な Unicode 文字ではなくバイトです。
list() と join() を使って文字列内の文字を置き換える
組み込み関数 list() で文字列をリストに変換し、0始まりのインデックスで置換後の文字を代入してから、文字を再び連結します。リストの要素をまとめるには、区切り文字列に対して join() を呼び出します。"" を使うと区切り文字は入りません。たとえば、インデックス 2 は3番目の文字を指します。
text = "Naze"
characters = list(text)
characters[2] = "m"
updated = "".join(characters)
print(updated)
Name
この方法では1か所だけが変わり、元の文字列の値はそのままです。updated は新しく連結した文字列を参照します。インデックスはリスト内の要素を指している必要があるため、位置がユーザー入力から与えられる場合は文字列の長さを確認してください。
bytearray() を使って文字列内の文字を置き換える
バイト単位で扱うテキストでは、まず文字列をエンコードし、変更可能な bytearray() 内のバイトに整数を代入してから、バイト列をデコードして再び文字列にします。この例では ASCII を使っており、示されている各文字は1バイトで表されます。
text = "Naze"
data = bytearray(text, "ascii")
data[2] = ord("m")
updated = data.decode("ascii")
print(updated)
Name
エンコードとデコードには互換性のある文字エンコーディングを使う必要があります。バイトのインデックスは、一般に Unicode 文字のインデックスとは一致しません。ASCII の範囲外の文字は、UTF-8 では複数バイトになることがあります。この方法は、データのエンコーディングとバイト位置を扱う必要がある場合に限って使い、通常のテキストには文字列を使う方法を選んでください。
replace() メソッドで一致する文字列を置き換える
文字列メソッド replace() に、置き換え前と置き換え後の文字列を渡します。デフォルトでは、置き換え前の文字列に一致する重ならない箇所をすべて変更し、結果を新しい文字列として返します。
text = "Naze"
updated = text.replace("z", "m")
print(updated)
Name
元の text は変更されません。置き換える一致箇所を制限するには、たとえば text.replace("a", "o", 1) のように、3番目の引数として個数を渡します。置き換え前の文字列が含まれていない場合、replace() は変更のない文字列を返します。これにより、代入の問題と綴りの不一致を切り分けやすくなります。
スライスと連結で、位置が分かっている文字を置き換える
0始まりの位置が分かっている場合は、その位置より前の部分を取り出し、置換後の文字を加えてから、その位置より後ろの部分を連結します。スライス text[:2] はインデックス 2 より前を残し、text[3:] はその文字の次から始まります。
text = "Naze"
updated = text[:2] + "m" + text[3:]
print(updated)
Name
この方法では、前後の部分を保ったまま新しい文字列を作成できます。置き換える文字の次の位置から後ろの部分を取り出してください。インデックスを誤ると、文字が抜けたり重複したりすることがあります。位置が分かっていて、用途に合う分かりやすい式にできる場合に使いましょう。ここでは速度を比較しません。