文字列の一部を別の文字列に置き換えたいとき、Pythonのstr.replace
は最初に覚えておくと便利なメソッドです。
本記事では、基本の使い方から回数制御、大小文字の扱い、重なり合いの注意点まで、初心者にも分かるように段階的に解説します。
他の文字列操作は別の記事で扱います。
Pythonのreplaceで文字列を置換する基本
str.replaceの構文
str.replace
は、文字列中の指定した部分文字列を別の文字列に置き換え、新しい文字列を返します。
構文は次のとおりです。
- 構文:
s.replace(old, new[, count])
引数の意味と挙動を表にまとめます。
引数名 | 型 | 必須 | 説明 |
---|---|---|---|
old | str | 必須 | 置換対象の部分文字列です。空文字も指定可能ですが挙動には注意が必要です。 |
new | str | 必須 | 置換後の文字列です。空文字にすると削除のように振る舞います。 |
count | int | 任意 | 置換する最大回数です。省略時はすべて置換します。0を指定すると置換は行われません。 |
返り値は、置換を反映した新しい文字列です。
すべての一致を一度に置換
count
を省略すると、見つかったすべての一致が一度に置換されます。
# すべての一致を一度に置換する例
s = "spam spam spam"
replaced = s.replace("spam", "ham") # 3箇所すべて置換
print(replaced)
ham ham ham
文字列は不変で新しい文字列を返す
Pythonの文字列は不変(immutable)です。
そのため、replace
は元の文字列を変更せず、新しい文字列を返します。
変数を更新したい場合は、代入し直す必要があります。
# 文字列は不変。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(... )
のように書きます。
# 変数を更新したいときは再代入する
date = "2022/12/31"
date = date.replace("/", "-")
print(date)
2022-12-31
count引数で置換回数を制御
回数を省略した場合の違い
count
を省略するとすべて置換、指定すると左から最大count
回だけ置換します。
# countの有無による違い
s = "banana"
print(s.replace("a", "A")) # 省略: すべて置換される
print(s.replace("a", "A", 2)) # 2回だけ置換される
bAnAnA
bAnAna
左から順に指定回数だけ置換
replace
は文字列の左から順に検索・置換します。
count
を指定すると、その回数に達したところで処理が止まります。
# 左から順に置換されることの確認
s = "aaaa"
print(s.replace("a", "X", 2)) # 左から2つだけ 'a' -> 'X'
XXaa
一致がないときの結果
置換対象old
が見つからない場合、文字列は変化しません。
count=0
も同様に変化はありません。
# 一致がない、またはcount=0のとき
s = "hello"
print(s.replace("z", "x")) # 'z'がないので変化しない
print(s.replace("l", "L", 0)) # 0回置換はそのまま
hello
hello
なお、old
とnew
が同じ場合も結果は変わらないため、意味のある置換にはなりません。
大文字小文字の扱いと注意点
replaceは大文字小文字を区別する
replace
はデフォルトで大文字小文字を区別します。
つまり、"apple"
と"Apple"
は別物として扱われます。
# 大文字小文字は区別される
s = "Apple apple APPLE"
print(s.replace("apple", "orange")) # 小文字の'apple'だけが置換される
Apple orange APPLE
大文字小文字を無視した置換をreplace
単体で行うことはできません。
大文字小文字を無視した置換の考え方
大文字小文字を無視して置換したい場合は、正規表現のre.sub
にre.IGNORECASE
フラグを付ける方法が実用的です。
# 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
は一度置換した箇所に重なる一致を再度検出しません。
左から非重複でマッチしていく点に注意してください。
# 重なり合う一致は置換されない
print("aaa".replace("aa", "b")) # 先頭の'aa'だけが'b'に。残りの'a'はそのまま
print("aaaa".replace("aa", "b")) # 非重複で2回マッチするので'bb'になる
ba
bb
また、old
に空文字""
を指定すると、各文字の間と両端にnew
が挿入されます。
意図しない結果を招きやすいため注意してください。
# oldに空文字を指定した場合の挙動
print("abc".replace("", "-"))
-a-b-c-
この挙動は仕様によるものです。
通常はold
に空文字を使わないようにすると安全です。
まとめ
本記事では、Pythonのstr.replace
による文字列置換の基本から、count
引数での回数制御、大文字小文字の扱い、重なり合いの注意点までを解説しました。
要点は次のとおりです。
replace
は元の文字列を変更せず新しい文字列を返し、count
省略で全置換、指定時は左から最大回数だけ置換します。
大文字小文字は区別され、無視した置換にはre.sub(..., flags=re.IGNORECASE)
の利用が現実的です。
さらに、重なり合う一致は一度の置換では対象にならず、old
に空文字を指定すると文字間に挿入される特殊な挙動になります。
まずはreplace
の基本を確実に押さえ、必要に応じて正規表現などの手段と使い分けていくと安心です。