特定文字を削除するとはどういうことか
Pythonで文字列を扱っていると、「カンマやハイフンを取り除きたい」「記号だけを消して中身だけ残したい」「危険な文字を除去して安全な文字列にしたい」といった場面がよくあります。 こうした「文字列の中から特定の文字(または文字の集合)を取り除く」操作が、特定文字を削除するという処理です。
この処理は、
- 入力の正規化
- データの整形
- セキュリティ対策(危険な文字の除去) などに直結する、とても重要なテクニックです。ここでは、初心者向けにステップバイステップで考えながら、
replace()・translate()・strip()などを中心に、例題・テンプレート・注意点を丁寧に解説していきます。
最も基本的な方法:replace() で特定文字を消す
1文字を削除する基本形
text = "1-2-3-4-5"
clean = text.replace("-", "")
print(clean) # "12345"
Python文字列.replace(削除したい文字, 置き換える文字) は、
- 指定した文字を
- 別の文字列に置き換える メソッドです。
削除したい場合は、 「空文字列 "" に置き換える」 ことで、実質的にその文字を消すことができます。
複数回出てくる文字もまとめて削除される
text = "hello, world, python"
clean = text.replace(",", "")
print(clean) # "hello world python"
Pythonreplace() は、
- 文字列全体の中にある対象文字を
- すべて置き換えます(デフォルトでは全件)
そのため、 「文字列中のカンマを全部消したい」といった処理に向いています。
一部だけ置き換えたい場合
text = "aaa-bbb-ccc"
clean = text.replace("-", "", 1)
print(clean) # "aaabbb-ccc"
Python3番目の引数に「最大置き換え回数」を指定すると、 左から順にその回数だけ置き換えます。
ただし、 「削除」という観点では、 「全部消す」ことが多く、回数指定はあまり使われない ことも覚えておくとよいです。
複数種類の文字をまとめて削除する:translate() を使う
複数の文字を一気に削除する
text = "hello, world. python!"
table = str.maketrans("", "", ",.!") # 第3引数に「削除したい文字」を列挙
clean = text.translate(table)
print(clean) # "hello world python"
Pythontranslate() は、
- 「どの文字をどう変換するか」を表す変換テーブルを作り
- それに従って文字列を変換する メソッドです。
str.maketrans("", "", "削除したい文字列") のように、 第3引数に「削除したい文字の集合」を渡すことで、 複数種類の文字をまとめて削除できます。
深掘り:replace() と translate() の違い
replace()→ 「1種類の文字(または部分文字列)を別の文字列に置き換える」translate()→ 「複数種類の文字を、変換テーブルに従って一括で変換・削除する」
少数の文字なら replace() で十分ですが、
- 記号をまとめて消したい
- 危険な文字を一括で除去したい といった場面では、
translate()の方がスッキリ書けます。
前後だけの特定文字を削除する:strip() 系の応用
先頭と末尾にある特定文字を削除する
text = "###title###"
clean = text.strip("#")
print(clean) # "title"
Pythonstrip("文字集合") は、
- 先頭と末尾に連続している「指定した文字集合に含まれる文字」を削除し
- 中央部分はそのまま残します。
この例では、
- 左右に連続している
#を削除し "title"だけを残しています。
左側だけ・右側だけ削除する
text = ">>>value<<<"
left_clean = text.lstrip(">")
right_clean = text.rstrip("<")
print(left_clean) # "value<<<"
print(right_clean) # ">>>value"
Pythonlstrip("文字集合")→ 左側だけ削除rstrip("文字集合")→ 右側だけ削除
という形で、 「先頭の記号だけ」「末尾の記号だけ」を取り除くことができます。
深掘り:strip系は「中身」は削除しない
strip()・lstrip()・rstrip() は、 「前後に連続している部分だけ」を削除する という性質があります。
文字列の中央にある同じ文字は削除されないため、
- 「装飾記号を取り除く」
- 「前後の空白や記号を削る」 といった用途に向いています。
特定文字削除のよくある用途
1. 数字だけを残す(記号やスペースを削除)
text = "TEL: 03-1234-5678"
table = str.maketrans("", "", "TEL: -")
digits = text.translate(table)
print(digits) # "0312345678"
Python電話番号やIDなど、 「数字だけを取り出したい」場面で、 不要な文字を削除することで目的の文字列を得られます。
2. カンマやドットを削除して数値文字列にする
price = "1,234,567"
clean = price.replace(",", "")
print(clean) # "1234567"
Python数値として扱いたい文字列から、 桁区切りのカンマを削除してから int() や float() に変換する、 というパターンはよく使われます。
3. 危険な記号を削除して安全な文字列にする
user_input = "<script>alert('xss')</script>"
table = str.maketrans("", "", "<>\"'")
safe = user_input.translate(table)
print(safe) # scriptalert(xss)/script
Pythonこのように、
<や>、"、'などの危険な記号を削除することで- そのまま表示しても問題が起きにくい文字列にする
といったセキュリティ対策にも応用できます。 ただし、実務では専用のエスケープ処理やライブラリを使うことが推奨されます。
セキュリティと品質の観点から見た「特定文字削除」の注意点
危険な文字を「削除するだけ」で安全になるとは限らない
user_input = "<script>alert('xss')</script>"
safe = user_input.translate(str.maketrans("", "", "<>"))
print(safe) # "scriptalert('xss')/script"
Python記号を削除した結果、
- 逆に意味のある別の文字列になってしまう
- ログや画面上で誤解を招く表示になる
といったこともあり得ます。
そのため、 「削除すれば安全になる」と安易に考えず、 エスケープやバリデーションと組み合わせて設計することが重要です。
入力の意味が変わってしまう可能性
code = "AB-C"
clean = code.replace("-", "")
print(clean) # "ABC"
Pythonこのように、 削除によって「別のコード」になってしまうことがあります。
- 元の入力をそのまま保存する
- 正規化後の入力を別途保存する
など、 「何を基準に判定するか」「どの値を信頼するか」 を明確にしておく必要があります。
ログや監査のときの扱い
raw = "<script>alert('xss')</script>"
safe = raw.translate(str.maketrans("", "", "<>"))
log_raw = f"raw='{raw}'"
log_safe = f"safe='{safe}'"
Pythonログに残すときは、
- 生の入力
- 正規化後の入力 両方を記録しておくことで、 後から「何が起きたか」を正しく追跡しやすくなります。
削除だけを行い、生の入力を捨ててしまうと、 監査や調査が難しくなることもあります。
特定文字削除のテンプレートと練習用コード
replace() で1種類の文字を削除するテンプレート
def remove_char(text: str, ch: str) -> str:
return text.replace(ch, "")
Pythontranslate() で複数種類の文字を削除するテンプレート
def remove_chars(text: str, chars: str) -> str:
table = str.maketrans("", "", chars)
return text.translate(table)
# 例: remove_chars("hello, world. python!", ",.!")
Pythonstrip() で前後の特定文字を削除するテンプレート
def trim_marks(text: str, marks: str = "#") -> str:
return text.strip(marks)
Python危険な記号を削除してログ用に整形するテンプレート
def sanitize_for_log(text: str) -> str:
dangerous = "<>\"'"
table = str.maketrans("", "", dangerous)
return text.translate(table)
Pythonまとめ
- 特定文字を削除する最も基本的な方法は
replace(削除したい文字, "")であり、1種類の文字を簡単に消せます。 - 複数種類の文字をまとめて削除したい場合は、
str.maketrans()とtranslate()を組み合わせることで、一括削除が効率よく行えます。 - 前後だけの特定文字を削除したい場合は、
strip()・lstrip()・rstrip()を使い、装飾記号や前後の不要な文字を柔軟に取り除けます。 - 特定文字削除は、入力の正規化・データ整形・セキュリティ対策に直結する一方で、「意味が変わる」「危険な文字列を完全には防げない」といったリスクもあるため、バリデーションやエスケープと組み合わせて設計することが重要です。
特定文字を削除するという操作は、シンプルに見えながら、 入力処理・ログ処理・セキュリティ・ユーザビリティのすべてに関わる基礎技術です。 ここを丁寧に押さえておくことで、Pythonでの文字列処理が一段と安定し、信頼できるものになっていきます。
