このガイドでは、Pythonで文字列から文字を削除する方法について見ていきます。
文字列、特にユーザーが作成した入力には、保存したくないユーザー名フィールドの特殊文字のような、不要な文字が含まれていることがあります。
そのような場合、与えられた文字列から特定の文字を削除することが望ましいかもしれません。
文字列から文字を削除する最も一般的な方法は replace()
メソッドですが、 translate()
メソッドを使用することもできますし、指定した文字が複数回出現した場合に置換することも可能です。
replace() を使って Python で文字を削除する
stringクラスは、ある文字を別の文字に置き換える
replace()` メソッドを提供しています。
文字列は不変なので、この関数が文字を置き換えた新しい文字列を返すことは注目に値します。
元の文字列は変更されませんが、メモリ上のオブジェクトは、その参照を保持し続けない限り失われてしまいます。
一般的には、返された値を同じポインタか新しいポインタに代入します。
このメソッドは、ある文字の出現箇所をすべて新しい文字に置き換えます。
例えば、 any_string.replace('a', 'b')
は any_string
内に存在する 'a'
をすべて 'b'
という文字に置き換えます。
文字列から文字を削除するには、 replace()
を使って、その文字を空の文字に置き換えます。
original_string = "stack abuse"
# Removing character 'a' and replacing with an empty character
new_string = original_string.replace('a', '')
print("String after removing the character 'a':", new_string)
このコードを実行すると、次のように表示されます。
String after removing the character 'a': stck buse
Pythonでtranslate()を使って文字を削除する。
Pythonの文字列には、翻訳テーブルで指定された他の文字に置き換える translate()
メソッドがあります。
翻訳テーブルとは、キーと値の対応をまとめた辞書で、各キーは値に置き換えられます。
このメソッドが動作するためには、文字列の Unicode 値を指定する必要があります。
これは ord()
関数で取得できます。
例えば、 any_string.ranslate({ord('a'):ord('z'), ord('b'):ord('y')})
は、 'a'
を 'z'
で、 'b'
を 'y'
で置き換えることができます。
translate()を使って文字列から文字を削除するには、その文字の Unicode 値を翻訳テーブルで
None` にマップする必要があります。
original_string = "stack abuse"
# removing character 'a'
new_string = original_string.translate({ord('a'): None})
print("String after removing the character 'a':", new_string)
このコードの結果は
String after removing the character 'a': stck buse
文字列の出現回数を削除する
replace()と
translate()メソッドは、与えられた文字の出現回数をすべて別の文字に置き換えます。
しかし、replace()メソッドにはオプションで
countという引数が与えられます。
この引数が指定された場合、指定された文字の出現回数のうちcount` 個だけを置き換えることができます。
それでは、文字列からすべての文字を削除するのではなく、最初の 'a'
のみを削除してみましょう。
original_string = "stack abuse"
# removing character 's'
new_string = original_string.replace('a', '', 1)
print("String after removing the character 'a':", new_string)
上のコードの出力は次のようになります。
String after removing the character 'a': stck abuse
カウントが 1
に設定されているので、最初に出現した 'a'
のみが置き換えられます – これは、1つの文字だけを削除したいときに便利です。
文字のない新しい文字列を手動で作成する
やや難解ではありますが、わかりやすいテクニックとしては、空の文字列を作成し、元の文字列をループさせる方法があります。
ループの中で、削除する文字以外のすべての文字を新しい文字列に書き込みます。
これは実際にボンネットの中で起こっていることで、いくつかの特別な検証を加えています。
PythonはCで実装されているので、 stringobject.c
のソースコードを見てみましょう。
このソースコードには replace()
メソッドが定義されていて、最終的に replace_single_character()
または replace_single_character_in_place()
が呼び出されるようになっています。
start = self_s;
end = self_s + self_len;
while (count-- > 0) {
next = findchar(start, end-start, from_c);
if (next == NULL)
break;
if (next == start) {
/* replace with the 'to' */
Py_MEMCPY(result_s, to_s, to_len);
result_s += to_len;
start += 1;
} else {
/* copy the unchanged old then the 'to' */
Py_MEMCPY(result_s, start, next-start);
result_s += (next-start);
Py_MEMCPY(result_s, to_s, to_len);
result_s += to_len;
start = next+1;
}
}
/* Copy the remainder of the remaining string */
Py_MEMCPY(result_s, start, end-start);
return result;
シンプルで直感的な高レベルのAPIの背後に、どれだけのロジックが抽象化されているかを理解するために、このプロセスを手動で行うことができます。
def remove_character(original_string, character, occurrence_num):
new_string = ""
for char in original_string:
if char == character and occurrence_num > 0:
occurrence_num = occurrence_num-1
continue
else:
new_string += char
return new_string
string = 'stack abuse'
print(remove_character(string, 'a', 0))
print(remove_character(string, 'a', 1))
print(remove_character(string, 'a', 2))
上記のコード片は以下のような出力を生成します。
stack abuse
stck abuse
stck buse
このメソッドは replace()
メソッドとほぼ同じ動作をしますが、効率はかなり悪いことがわかります。
print("Time taken by manual method: {}"
.format(timeit.timeit("remove_character('stack abuse', 'a', 1)", "from __main__ import remove_character")))
print("Time taken by replace(): {}"
.format(timeit.timeit("'stack abuse'.replace('a', '', 1)")))
これらのメソッドをタイミングよく実行すると、次のようになります。
Time taken by manual method: 1.3785062030074187
Time taken by replace(): 0.13279212499037385
結論
このチュートリアルでは、Python で文字列から文字を削除する方法を探りました。
文字列から文字を削除するには、 replace()
と translate()
メソッドを使用して、文字を空文字列または Unicode を None
で置き換える方法を見てきました。
その後、replace()
を使って、与えられた文字のあらかじめ定義された出現回数を削除したり、古き良き for
ループも使ってきました。
translate()メソッドは、翻訳テーブルを与えることができるので、文字のセットを削除しなければならない場合に便利です。
また、replace()` メソッドは、指定した文字の出現回数を削除したい場合に便利なメソッドです。