Pythonで文字列の一部を別の文字列に置き換えたい場面は、データの整形やテキスト処理など、日常的なプログラミング作業で頻繁に発生します。Pythonで文字列を置換する際によく使われるのが、str型のreplaceメソッドです。引数の指定次第で、全置換・部分置換・削除といった操作を簡単に実現できます。
しかし、replaceメソッドの引数の意味や、複数の文字列をまとめて置換する方法を正確に理解できていない方も多いのではないでしょうか。特に複数置換を行う場合は、置換順序によって意図しない結果が発生する可能性もあります。
この記事では、Pythonのreplaceメソッドの基本的な使い方を中心に解説します。複数文字列の一括置換や、replaceで対応できないケースの選択肢まで、サンプルコード付きで紹介していきます。
目次
- Pythonのreplaceメソッドで文字列を置換する方法
- 指定した文字列を別の文字列に置換する
- 置換回数を指定して先頭から順に置換する
- 空文字を指定して特定の文字列を削除する
- Pythonのreplaceで複数の文字列をまとめて置換する方法
- replaceをチェーンして順に置換する
- forループと辞書で一括置換する
- Pythonのreplaceで対応できないケースと代替手段
- パターンに一致する文字列を置換したい場合(re.sub)
- 複数の文字を1文字ずつ一括変換したい場合(translate)
- Pythonのreplaceに関するよくある質問
- Pythonのreplaceメソッドは元の文字列を変更しますか?
- 大文字・小文字を区別せずに置換するにはどうすればよいですか?
- replaceで置換対象が見つからない場合はエラーになりますか?
Pythonのreplaceメソッドで文字列を置換する方法
replaceメソッドとは、文字列内の指定した部分文字列を別の文字列に置き換える、str型のメソッドです。基本的な構文は以下の通りです。
文字列.replace(old, new, count=-1)
第1引数のoldには置換対象の文字列、第2引数のnewには置換後の文字列を指定します。第3引数のcountは省略可能で、置換する最大回数を指定できます。
countのデフォルト値は-1で、省略時や-1を指定した場合は全ての一致箇所が置換されます。また、Pythonの文字列はイミュータブル(不変)であるため、replaceメソッドは元の文字列を変更せず、新しい文字列を返します。
Return a copy of the string with all occurrences of substring old replaced by new. If the optional argument count is given, only the first count occurrences are replaced.
出典:Python公式ドキュメント - Built-in Types str.replace
ここからは、replaceメソッドの代表的な3つの使い方(全置換・回数指定・削除)を、サンプルコード付きで順に見ていきます。
指定した文字列を別の文字列に置換する
replaceメソッドの最も基本的な使い方は、第1引数に置換対象の文字列、第2引数に置換後の文字列を指定する方法です。第3引数を省略した場合、対象の文字列に含まれる全ての一致箇所が置換されます。
text = "Python is fun. Python is powerful."
result = text.replace("Python", "Java")
print(result)
# 出力: Java is fun. Java is powerful.
上記のコードでは、変数textに格納された文字列内の「Python」を全て「Java」に置換しています。replaceメソッドは元の文字列を変更しないため、置換結果を利用するには戻り値を変数に代入する必要があります。
なお、置換対象の文字列が見つからない場合は、元の文字列がそのまま返されるため、エラーは発生しません。
置換回数を指定して先頭から順に置換する
replaceメソッドの第3引数にcountを指定すると、先頭から指定した回数分だけ置換を行います。文字列内に同じ文字列が複数回出現する場合に、最初のN個だけを置換したいときに便利です。
text = "apple, apple, apple, apple"
result = text.replace("apple", "orange", 2)
print(result)
# 出力: orange, orange, apple, apple
上記のコードでは、第3引数に2を指定しているため、先頭から2つの「apple」だけが「orange」に置換されています。3つ目以降の「apple」はそのまま残ります。
なお、countに0を指定した場合は置換が一切行われず、元の文字列がそのまま返されます。
空文字を指定して特定の文字列を削除する
replaceメソッドの第2引数に空文字("")を指定すると、対象の文字列を削除できます。不要な文字やスペース、記号を取り除きたい場合に有効な方法です。
text = "Hello World"
result = text.replace(" ", "")
print(result)
# 出力: HelloWorld
phone = "090-1234-5678"
result = phone.replace("-", "")
print(result)
# 出力: 09012345678
上記のコードでは、1つ目の例でスペースを全て削除し、2つ目の例で電話番号からハイフンを削除しています。
replaceメソッドは指定した部分文字列に一致する箇所を全て置換するため、「 」(半角スペース1つ)を置換対象にすると連続するスペース内の各スペースにもそれぞれ一致します。その結果、すべてのスペースが除去されます。
Pythonのreplaceで複数の文字列をまとめて置換する方法
文字列内に置換したい箇所が複数種類ある場合、replaceメソッドを1回呼ぶだけでは対応できません。Pythonでは、replaceメソッドを連続で呼び出す方法や、辞書とforループを組み合わせる方法で複数の文字列をまとめて置換できます。
置換対象が2〜3種類であればチェーン方式が簡潔ですが、それ以上の場合は辞書方式の方が保守しやすいでしょう。ここでは2つの代表的な方法をサンプルコード付きで解説します。
replaceをチェーンして順に置換する
replaceメソッドは文字列を返すため、戻り値に対してさらにreplaceメソッドを呼び出すチェーン(連鎖)が可能です。メソッドチェーンとは、メソッドの戻り値に対して続けて別のメソッドを呼び出す記法のことです。
text = "I like apple and banana."
result = text.replace("apple", "grape").replace("banana", "melon")
print(result)
# 出力: I like grape and melon.
上記のコードでは、最初のreplaceで「apple」を「grape」に置換した戻り値に対して、2つ目のreplaceで「banana」を「melon」に置換しています。
チェーン方式は置換対象が少ない場合に読みやすい一方、置換が左から右へ順番に実行されるため、先に置換した結果が後の置換に影響する場合がある点に注意してください。たとえば「A→B」の後に「B→C」を実行すると、元のAもCに置き換わってしまいます。
forループと辞書で一括置換する
置換対象が多い場合は、辞書(dict)に置換前と置換後のペアを定義し、forループで順に適用する方法が便利です。辞書を使うことによって置換ルールをデータとして管理できるため、追加や変更が容易です。
text = "東京都 渋谷区 神宮前 1-2-3"
replacements = {
"東京都": "Tokyo",
"渋谷区": "Shibuya",
"神宮前": "Jingumae"
}
for old, new in replacements.items():
text = text.replace(old, new)
print(text)
# 出力: Tokyo Shibuya Jingumae 1-2-3
上記のコードでは、replacements辞書に3組の置換ルールを定義し、forループで辞書のキーと値を取り出しながら順に置換を実行しています。Python 3.7から辞書の挿入順保持が言語仕様として保証されているため、辞書に登録した順で置換が実行されます。
ただしこの方法でもチェーン方式と同様に、先に置換した結果が後の置換対象と一致すると意図しない動作が発生します。置換ルール同士が干渉しないことを事前に確認してください。
Pythonのreplaceで対応できないケースと代替手段
replaceメソッドは「固定の文字列を指定して置換する」ためのメソッドであるため、パターンベースの条件や文字単位の変換には向いていません。ここではreplaceで対応が難しい代表的なケースと、その際に検討したい代替手段を紹介します。
パターンに一致する文字列を置換したい場合(re.sub)
「電話番号のような特定形式の文字列だけを置換したい」「大文字・小文字を区別せずに置換したい」といったケースでは、replaceメソッドでは対応できません。これらのケースでは、標準ライブラリのreモジュールに含まれるre.sub関数を使って正規表現ベースの置換を行います。
import re
text = "電話番号: 090-1234-5678"
result = re.sub(r"\d{2,4}-\d{2,4}-\d{4}", "***-****-****", text)
print(result)
# 出力: 電話番号: ***-****-****
上記のコードでは、ハイフン区切りの数字列(電話番号に似た形式)に一致する箇所を、正規表現パターンによって一括でマスキングしています。また、re.subにflags=re.IGNORECASEを渡せば、大文字・小文字を区別しない置換も可能です。
複数の文字を1文字ずつ一括変換したい場合(translate)
「全角数字を半角数字に変換したい」「複数の記号をまとめて削除したい」といった1文字単位の変換を行いたい場合は、str型のtranslateメソッドを使うと効率的です。replaceメソッドを何度も呼び出す代わりに、変換テーブルを1つ作成すれば1回の呼び出しで処理が完了します。
text = "09012345678"
table = str.maketrans("0123456789", "0123456789")
result = text.translate(table)
print(result)
# 出力: 09012345678
上記のコードでは、全角数字10文字と半角数字10文字を対応付けた変換テーブルを作成し、一度のtranslate呼び出しで全角数字を半角数字に変換しています。
Pythonのreplaceに関するよくある質問
Pythonのreplaceメソッドは元の文字列を変更しますか?
replaceメソッドは元の文字列を変更しません。Pythonの文字列はイミュータブル(不変)なオブジェクトであり、一度作成された文字列は変更できない仕様になっているため、replaceメソッドを含む文字列操作メソッドは常に新しい文字列を返します。
置換結果を使用するには、戻り値を変数に代入する必要があります。
| 操作 | 結果 |
|---|---|
| text.replace("a", "b") | 新しい文字列を返す(textは変更されない) |
| text = text.replace("a", "b") | 置換結果をtextに再代入する |
元の文字列を保持したまま置換結果を使いたい場合は、別の変数に代入してください。
大文字・小文字を区別せずに置換するにはどうすればよいですか?
replaceメソッドには大文字・小文字を無視するオプションがありません。このような場合はreモジュールのre.sub関数にre.IGNORECASEフラグを指定することで対応できます。
import re
text = "Python python PYTHON"
result = re.sub(r"python", "Java", text, flags=re.IGNORECASE)
print(result)
# 出力: Java Java Java
上記のコードでは、flags=re.IGNORECASEを指定することによって、「Python」「python」「PYTHON」の全てが「Java」に置換されています。replaceメソッドでは大文字・小文字の組み合わせごとにreplace呼び出しが必要ですが、re.subなら1回の呼び出しで対応できます。
replaceで置換対象が見つからない場合はエラーになりますか?
replaceメソッドは、第1引数に指定した文字列が対象の文字列内に見つからなくてもエラーになりません。この場合、元の文字列がそのまま返されます。
text = "Hello, World!"
result = text.replace("Python", "Java")
print(result)
# 出力: Hello, World!
上記のコードでは、text内に「Python」が存在しないため、元の「Hello, World!」がそのまま返されています。この挙動により、置換対象の有無を事前にチェックしなくても安全に呼び出せます。
※上記コンテンツの内容やソースコードはAIで確認・デバッグしておりますが、間違いやエラー、脆弱性などがある場合は、コメントよりご報告いただけますと幸いです。
ITやプログラミングに関するコラム
PythonをWebで実行する方法
共通テスト「情報Ⅰ」2年目で変わる、日本の教育と学び方
gitでブランチ(branch)を切り替える方法
git cloneでブランチを指定する方法
64GBのメモリが必要な人・不要な人の特徴
PCを再起動するコマンド一覧
CapsLock以外で大文字になる原因【Windows編】
パソコンで大文字になるのを解除する方法
面白いAIの活用事例を業界別に紹介
Gitでcommit(コミット)を取り消す方法
ITやプログラミングに関するニュース
サイボウズがkintone AIを正式提供、β版から約1年を経てクレジット制を導入
ロゼッタのラクヤクAIがCSRドラフト作成期間を90%以上短縮、従来4週間を約2日に
AI CROSSが不動産業界向け生成AI伴走支援を開始、アスコットの業務AI実装を実践サポート
日本情報クリエイトが「オーナー提案AIロボⅡ」売買査定を刷新、月1万円からW査定が回数無制限に
Wur株式会社がAI新規事業診断サービス「MVP事業診断レポート」をリリース、12の質問で事業構想を約10分で分析
バトンズがM&A専門家向け「AI概要書」β版を提供開始、企業概要書のドラフトを最速3分で自動生成
SCSKが観光DXサービス「Connexia」を開発、首里城公園でNFT活用の周遊促進が始動
Verdent AI発表、エンジニア不要でソフトウェアを構築する「AIエンジニアリングチーム」が登場
ゼネラルBREXAテクノロジーが外食・小売向けAIサービス「aimana」を開発、店長の意思決定をデータで支援
田中組がKencopa工程AIエージェント製品版を先行利用開始、建設現場の工程管理属人化を解消へ
