閉じる

Pythonのreplaceで文字列を置換: 回数や大文字小文字も解説

文字列の一部を別の文字列に置き換えたいとき、Pythonのstr.replaceは最初に覚えておくと便利なメソッドです。

本記事では、基本の使い方から回数制御、大小文字の扱い、重なり合いの注意点まで、初心者にも分かるように段階的に解説します。

他の文字列操作は別の記事で扱います。

Pythonのreplaceで文字列を置換する基本

str.replaceの構文

str.replaceは、文字列中の指定した部分文字列を別の文字列に置き換え、新しい文字列を返します。

構文は次のとおりです。

  • 構文: s.replace(old, new[, count])

引数の意味と挙動を表にまとめます。

引数名必須説明
oldstr必須置換対象の部分文字列です。空文字も指定可能ですが挙動には注意が必要です。
newstr必須置換後の文字列です。空文字にすると削除のように振る舞います。
countint任意置換する最大回数です。省略時はすべて置換します。0を指定すると置換は行われません。

返り値は、置換を反映した新しい文字列です。

すべての一致を一度に置換

countを省略すると、見つかったすべての一致が一度に置換されます。

Python
# すべての一致を一度に置換する例
s = "spam spam spam"
replaced = s.replace("spam", "ham")  # 3箇所すべて置換
print(replaced)
実行結果
ham ham ham

文字列は不変で新しい文字列を返す

Pythonの文字列は不変(immutable)です。

そのため、replaceは元の文字列を変更せず、新しい文字列を返します。

変数を更新したい場合は、代入し直す必要があります。

Python
# 文字列は不変。replaceは新しい文字列を返す
s = "hello world"
t = s.replace("l", "L")  # 'l'を'L'に置換した新しい文字列を受け取る

print(s)      # 元の文字列は変化しない
print(t)      # 置換後の新しい文字列
print(s is t) # 同一オブジェクトかどうかの確認(Falseが期待されます)
実行結果
hello world
heLLo worLd
False

元の変数に反映したい場合は、s = s.replace(... )のように書きます。

Python
# 変数を更新したいときは再代入する
date = "2022/12/31"
date = date.replace("/", "-")
print(date)
実行結果
2022-12-31

count引数で置換回数を制御

回数を省略した場合の違い

countを省略するとすべて置換、指定すると左から最大count回だけ置換します。

Python
# countの有無による違い
s = "banana"

print(s.replace("a", "A"))      # 省略: すべて置換される
print(s.replace("a", "A", 2))   # 2回だけ置換される
実行結果
bAnAnA
bAnAna

左から順に指定回数だけ置換

replaceは文字列の左から順に検索・置換します。

countを指定すると、その回数に達したところで処理が止まります。

Python
# 左から順に置換されることの確認
s = "aaaa"
print(s.replace("a", "X", 2))   # 左から2つだけ 'a' -> 'X'
実行結果
XXaa

一致がないときの結果

置換対象oldが見つからない場合、文字列は変化しません。

count=0も同様に変化はありません。

Python
# 一致がない、またはcount=0のとき
s = "hello"
print(s.replace("z", "x"))     # 'z'がないので変化しない
print(s.replace("l", "L", 0))  # 0回置換はそのまま
実行結果
hello
hello

なお、oldnewが同じ場合も結果は変わらないため、意味のある置換にはなりません。

大文字小文字の扱いと注意点

replaceは大文字小文字を区別する

replaceはデフォルトで大文字小文字を区別します。

つまり、"apple""Apple"は別物として扱われます。

Python
# 大文字小文字は区別される
s = "Apple apple APPLE"
print(s.replace("apple", "orange"))  # 小文字の'apple'だけが置換される
実行結果
Apple orange APPLE

大文字小文字を無視した置換をreplace単体で行うことはできません。

大文字小文字を無視した置換の考え方

大文字小文字を無視して置換したい場合は、正規表現のre.subre.IGNORECASEフラグを付ける方法が実用的です。

Python
# re.subを使って大文字小文字を無視して置換する
import re

s = "Apple apple APPLE"
result = re.sub(r"apple", "orange", s, flags=re.IGNORECASE)
print(result)
実行結果
orange orange orange

補足として、re.IGNORECASEはUnicodeの大小文字対応を考慮します。

元の単語の大文字小文字の形(例: Apple→Orange、APPLE→ORANGE)を保ちたい場合は、マッチ結果を関数で受け取り、形を判定して返す少し高度なテクニックが必要になりますが、本記事の範囲外とします。

重なり合う部分は置換されない

replaceは一度置換した箇所に重なる一致を再度検出しません。

左から非重複でマッチしていく点に注意してください。

Python
# 重なり合う一致は置換されない
print("aaa".replace("aa", "b"))   # 先頭の'aa'だけが'b'に。残りの'a'はそのまま
print("aaaa".replace("aa", "b"))  # 非重複で2回マッチするので'bb'になる
実行結果
ba
bb

また、oldに空文字""を指定すると、各文字の間と両端にnewが挿入されます。

意図しない結果を招きやすいため注意してください。

Python
# oldに空文字を指定した場合の挙動
print("abc".replace("", "-"))
実行結果
-a-b-c-

この挙動は仕様によるものです。

通常はoldに空文字を使わないようにすると安全です。

まとめ

本記事では、Pythonのstr.replaceによる文字列置換の基本から、count引数での回数制御、大文字小文字の扱い、重なり合いの注意点までを解説しました。

要点は次のとおりです。

replaceは元の文字列を変更せず新しい文字列を返し、count省略で全置換、指定時は左から最大回数だけ置換します。

大文字小文字は区別され、無視した置換にはre.sub(..., flags=re.IGNORECASE)の利用が現実的です。

さらに、重なり合う一致は一度の置換では対象にならず、oldに空文字を指定すると文字間に挿入される特殊な挙動になります。

まずはreplaceの基本を確実に押さえ、必要に応じて正規表現などの手段と使い分けていくと安心です。

この記事を書いた人
エーテリア編集部
エーテリア編集部

人気のPythonを初めて学ぶ方向けに、文法の基本から小さな自動化まで、実際に手を動かして理解できる記事を書いています。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!