文字列を置換するとはどういうことか
Pythonで文字列を扱っていると、「特定の単語を別の単語に差し替えたい」「区切り文字を変更したい」「危険な文字列を安全な文字列に置き換えたい」といった場面が頻繁に出てきます。 こうした「文字列の中の一部を、別の文字列に入れ替える」操作が 文字列の置換(replace) です。
文字列の置換は、
- 表示文言の修正
- データ形式の変換
- セキュリティ対策(危険な部分のマスク) などに直結する、非常に重要なテクニックです。ここでは、初心者向けにステップバイステップで考えながら、
str.replace()を中心に、例題・テンプレート・注意点を丁寧に解説していきます。
基本の置換:str.replace() の使い方
最もシンプルな置換の例
text = "Pythonは楽しい。Pythonは便利。"
new_text = text.replace("Python", "プログラミング言語")
print(new_text) # プログラミング言語は楽しい。プログラミング言語は便利。
Python文字列.replace(置換したい部分文字列, 新しい文字列) は、
- 元の文字列の中から
- 指定した「部分文字列」を探し
- それを「新しい文字列」に置き換えた結果 を返します。
ここで重要なのは、 元の文字列は変更されず、新しい文字列が返される という点です。Pythonの文字列はイミュータブル(変更不可)なので、 replace() を呼ぶたびに「新しい文字列」が作られます。
すべての一致箇所が置換される
text = "aaa-bbb-aaa-ccc"
new_text = text.replace("aaa", "XXX")
print(new_text) # XXX-bbb-XXX-ccc
Pythonreplace() は、
- デフォルトでは「一致したすべての箇所」を置換します。
「1箇所だけ変えたい」のか「全部変えたい」のかを意識して使うことが大切です。
置換回数を制限する:第3引数 maxreplace
左から指定回数だけ置換する
text = "aaa-bbb-aaa-ccc"
new_text = text.replace("aaa", "XXX", 1)
print(new_text) # XXX-bbb-aaa-ccc
Pythonreplace(置換前, 置換後, 最大置換回数) のように、 3番目の引数で「最大置換回数」を指定できます。
この例では、
- 左から順に「aaa」を探し
- 最初の1回だけ「XXX」に置き換え
- 2回目以降の「aaa」はそのまま残しています。
もう少し複雑な例
text = "ERROR: something failed. ERROR: retrying."
new_text = text.replace("ERROR", "WARN", 1)
print(new_text) # WARN: something failed. ERROR: retrying.
Pythonログの先頭だけレベルを変えたい、 最初の1箇所だけ差し替えたい、といった場面で便利です。
深掘り:maxreplace をどう使い分けるか
- 「全部置換したい」 → 第3引数は省略
- 「最初の1回だけ」 →
replace(..., 1) - 「最初の2回だけ」 →
replace(..., 2)
初心者のうちは「全部置換」が多いですが、 ログやメッセージの一部だけ変えたい場面では、 「どこまで置換するか」を意識して設計することが重要です。
置換で「削除」もできる:空文字列への置換
特定の文字を削除する
text = "1-2-3-4-5"
clean = text.replace("-", "")
print(clean) # "12345"
Python削除したい場合は、 「空文字列 "" に置き換える」 ことで、実質的にその部分を消すことができます。
これは、
- 記号を取り除く
- 区切り文字を消す
- 不要な文字を削除する といった場面でよく使われます。
特定の単語を削除する
text = "これは秘密のメッセージです。秘密は守られます。"
clean = text.replace("秘密", "")
print(clean) # これはのメッセージです。は守られます。
Pythonただし、 このように単語を削除すると、 文として不自然になることもあるため、 「削除しても意味が通るか」を意識して使う必要があります。
文字列置換のよくある用途
1. 表示文言の一括修正
text = "ユーザー名を入力してください。ユーザー名は必須です。"
new_text = text.replace("ユーザー名", "ログインID")
print(new_text)
PythonUI文言やメッセージの用語を変更したいときに、 replace() を使うことで簡単に差し替えられます。
2. 区切り文字の変更
csv_line = "Taro,20,Tokyo"
tsv_line = csv_line.replace(",", "\t")
print(tsv_line) # Taro 20 Tokyo
Pythonカンマ区切りをタブ区切りに変えたい、 セミコロン区切りをカンマ区切りに変えたい、 といった場面で便利です。
3. マスク処理(部分的に隠す)
card = "1234-5678-9012-3456"
masked = card.replace("5678-9012", "****-****")
print(masked) # 1234-****-****-3456
Pythonログや画面に表示するときに、
- 一部だけを
****に置き換える ことで、機密情報を守ることができます。
セキュリティの観点から見た文字列置換
危険な文字列を「安全な文字列」に置き換える
user_input = "<script>alert('xss')</script>"
safe = user_input.replace("<", "<").replace(">", ">")
print(safe) # <script>alert('xss')</script>
PythonHTMLを表示するときに、 < や > をエスケープすることで、 ブラウザがそれを「タグ」として解釈しないようにできます。
ただし、 実務では専用のテンプレートエンジンやエスケープ関数を使うことが推奨されます。 「手作業の置換だけで完全に安全にするのは難しい」 ということを意識しておくことが重要です。
SQLやコマンドを文字列置換で組み立てない
user = "Taro"
query = "SELECT * FROM users WHERE name = '" + user + "'"
Pythonこのような書き方は、
- ユーザー入力に
'や;が含まれていた場合 - 意図しないSQLが実行される可能性 があり、非常に危険です。
文字列置換や結合でSQLやシェルコマンドを組み立てるのではなく、
- プレースホルダ
- パラメータバインディング
- 専用ライブラリ を使うべきだという点は、 初心者のうちから意識しておくと良いです。
ログに残すときのマスク処理
password = "secret123"
log = f"password={password.replace(password, '******')}"
print(log) # password=******
Pythonログにパスワードやトークンをそのまま残すのは危険です。 文字列置換を使って、
- 実際の値を
******に置き換える ことで、ログからの漏洩リスクを下げることができます。
文字列置換の注意点と落とし穴
部分一致による「意図しない置換」
text = "cat catalog category"
new_text = text.replace("cat", "dog")
print(new_text) # dog dogalog dogegory
Pythonreplace("cat", "dog") は、
"cat"という文字列が含まれるすべての場所を置換します。
そのため、
"catalog"の中の"cat""category"の中の"cat"も置換されてしまいます。
「単語としての一致」だけを置換したい場合は、 正規表現(re モジュール)などを使う必要がある という点を覚えておくとよいです。
置換順序による予期せぬ結果
text = "abc"
text1 = text.replace("a", "b").replace("b", "c")
print(text1) # cc
Python- 最初に
"a"を"b"に置換 - 次に
"b"を"c"に置換
という順序で処理されるため、 結果として "cc" になります。
置換を連続して行うときは、 「どの順番で置換されるか」「中間結果がどうなるか」 を意識して設計する必要があります。
文字列はイミュータブル:元の文字列は変わらない
text = "hello"
text.replace("h", "H")
print(text) # "hello"
Pythonreplace() は新しい文字列を返すだけで、 元の text は変わりません。
変更を反映させたい場合は、
text = text.replace("h", "H")
Pythonのように、 「戻り値を変数に代入し直す」 ことを忘れないようにする必要があります。
文字列置換のテンプレートと練習用コード
基本的な置換テンプレート
def replace_all(text: str, old: str, new: str) -> str:
return text.replace(old, new)
Python回数制限付き置換テンプレート
def replace_limited(text: str, old: str, new: str, count: int) -> str:
return text.replace(old, new, count)
Python削除としての置換テンプレート
def remove_substring(text: str, sub: str) -> str:
return text.replace(sub, "")
Pythonマスク処理テンプレート
def mask_middle(text: str, target: str) -> str:
return text.replace(target, "****")
Pythonまとめ
- 文字列の置換には
str.replace(置換前, 置換後)が基本であり、デフォルトでは一致したすべての箇所が置換されます。 - 第3引数で「最大置換回数」を指定することで、左から順に指定回数だけ置換することができ、ログやメッセージの一部だけを変更したい場面に役立ちます。
- 空文字列
""に置き換えることで、実質的に「削除」として使うこともでき、記号や不要な部分を取り除く処理に応用できます。 - セキュリティの観点では、危険な文字列を安全な表現に置き換えたり、ログに残す際に機密情報をマスクしたりする場面で文字列置換が重要な役割を果たしますが、SQLやコマンドの組み立てに安易に使うのは危険です。
- 部分一致による意図しない置換や、置換順序による予期せぬ結果、イミュータブルゆえに元の文字列が変わらない点など、文字列置換にはいくつかの落とし穴があるため、挙動を正しく理解して設計することが大切です。
文字列を置換するという操作は、見た目以上に奥が深く、 表示・データ整形・セキュリティ・ログ設計など、さまざまな場面に関わる基礎技術です。 ここを丁寧に押さえておくことで、Pythonでの文字列処理が一段と安定し、信頼できるものになっていきます。
