Python初心者が理解しやすい、基本のキから解説するシリーズ。
今回はPythonにおける文字列の置換(置き換え)についてです。
- 文字列を別の表現に置換したい replace()
- 特定の1文字を別の文字に置き換えたい translate()
- 文字to文字の変換マッピングを作りたい translate()
- あるパターンにマッチする文字列を置換したい re.sub()
文字列の置換の扱い方について、現役のエンジニアが解説しています。
なお、説明を明確にするために、今回は「置換」と「変換」の意味を区別しています。
| 置換 | 文字(列)を別の文字(列)に置き換える |
|---|---|
| 変換 | 別の変数型(例. intやfloat)から文字列型(str)にする、または逆 |
結論
replace()は文字列strの関数(インストール、インポートは不要)
文字列を別の表現に置換
old = "bar bar foo buz"
new = old.replace('bar', 'zzz')
print(new)
# zzz zzz foo buz
特定の1文字を別の文字に置き換え
text = "xxx yyy zzz"
s = text.translate(str.maketrans({'x':'s', 'y':'m', 'z':'l'}))
print(s)
# sss mmm lll
パターンにマッチする文字列を置換
re ライブラリのimportを忘れずに。
import re
text = "foo 123 buz 567"
s = re.sub(r'[a-z]', 'Z', text)
print(s)
# ZZZ 123 ZZZ 567
実行環境
Python 3.9.2
文字列を置換する replace()
文字列を置換(置き換え)する最も簡単な方法はreplace()を使うこと。
replace()は文字列strの関数で、以下のような構文です。
t = replace(old, new, [count])
| old | 置換前の文字列 |
| new | 置換後の文字列 |
| count | (任意)置換する最大回数 |
"bar"を"zzz"に置き換えたいときは以下のように書きます。
text = "bar bar foo buz"
output = text.replace('bar', 'zzz')
print(output)
# zzz zzz foo buz
引数countを指定しなければ、一致する文字列はすべてnewに置換されます。
countを指定して、例えば1回だけ置換したいときは以下のようになります。
2つ目の"bar"は置換されていないことが確認できます。
text = "bar bar foo buz"
output = text.replace('bar', 'zzz', 1)
print(output)
# zzz bar foo buz
replace()の応用:任意の文字列を削除
文字列の中から取り除きたい部分文字列があるときは replace() を応用します。
引数 new に ""(空文字列)を指定すればOKです。
raw ="abcdef"
deleted = raw.replace('cde', '')
print(deleted)
# abf
replace()では、引数countを指定しなければ、一致する部分のすべてを置き換えます。
raw = "foobar_foobar"
deleted = raw.replace('foo', '')
print(deleted)
# bar_bar
最初に発見した部分だけ削除するには、置換回数を 1 に指定します。
raw = "foobar_foobar"
deleted = raw.replace('foo', '', 1)
print(deleted)
# bar_foobar
replace()の応用:2つ以上の置換を同時に行う
同じ文字列変数に対し、複数の組み合わせで置換するにはどうしたらいいでしょうか?
そんなときもreplace()を重ねて呼び出します。
text ="abc def"
s = text.replace('abc', 'zzz').replace('def', 'yyy')
print(s)
# zzz yyy
注意しなければならないのは、replace()は呼ばれるたび、文字列の先頭から順次置換していくということ。
最初に呼ばれたreplace()が優先されるので、後のreplace()で想定外の動作をする場合に注意しましょう。
例. replace()を単純に2回呼び出すだけでは文字列の入れ替えはできません
text ="abcdef"
s = text.replace('bc', 'ef').replace('ef', 'bc')
print(s)
# abcdbc
特定の1文字を別の文字に置き換える translate()
ある1文字を別の文字に置き換えるには str.translate() を利用します。
特定の1文字の置換だけなら replace() でも十分ですが、translate() は複数の組み合わせを置換可能です。
まず置き換える変換テーブル(マッピング)をstr.maketrans()で作成します。
t = str.maketrans({'x':'r', 'y':'t'})
その変換テーブルをstr.translate()に渡して置換を実行します。
new_string = old_string.translate(t)
"x"を"r"に、"y"を"t"に変換する例。
raw = "x=40 y=110"
t = str.maketrans({'x':'r', 'y':'t'})
s = raw.translate(t)
print(s)
# r=40 t=110
上のサンプルコードは次のようにまとめて書けます。
Pythonでよく使うコードパターンなので、覚えてしまいましょう。
s = raw.translate(str.maketrans({'x':'r', 'y':'t'}))
ある文字を削除するときは、変換先をNoneとします。
text = "-abc-def-"
s = text.translate(str.maketrans({'-': None}))
print(s)
# abcdef
記号を別の記号に置き換えるときにも使えます。
raw = "hoge [fuga] hogu"
s = raw.translate(str.maketrans({'[':'<', ']':'>'}))
print(s)
# hoge hogu
パターンにマッチする文字列を置換 re.sub()
あるパターンにマッチする箇所を置換するにはライブラリ re のre.sub()を用います。
呼び出すにはreモジュールのimportが必要(インストールは不要)です。
パターンを表現するには正規表現を使います。
re.sub()の基本的な引数は次のとおり。
re.sub(pattern, repl, string)
| pattern | 正規表現で表したパターン |
| repl | 置換後の文字列 |
| string | 置換対象の文字列 |
数字部分を"n"に置き換える例
import re
text = "foo123buz567"
s = re.sub(r'\d', 'n', text)
print(s)
# foonnnbuznnn
特定の文字のマッチング(「いずれかを含む」)は[ ]で囲みます。
text = "foo123buz567"
s = re.sub(r'[567]', 'n', text)
print(s)
# foo123buznnn
複数ある文字列のいずれかがマッチするか判定するには、|(パイプ、縦線)で区切って書きます。
text = "foo123buz567"
s = re.sub(r'foo|buz', 'zzz', text)
print(s)
# zzz123zzz567
マッチした特定の範囲を再利用するには、グループ化して取り出します。
() で囲んだ部分はグループ化され、replで/1, /2,...と表現して取り出せます。
例えば、下記のサンプルでは、数字"123"部分が/1で取り出されています。
例. "foo"と数字の間に"bar"を挿入したいとき
text = "foo123buz567"
s = re.sub(r'foo(\d*)', r'foobar\1', text)
print(s)
# foobar123buz567
Pythonの学習法について
Python の勉強が辛くなっていませんか?
Pythonは比較的取り組みやすい言語と言われていますが、プログラミング初心者にとっては分からないことだらけ。
ゼロから独学で勉強するのは厳しい道のりです。
今回、様々な現場、システム、言語を経験してきた現役エンジニアの立場から、初心者でも挫折しない学習方法を解説する記事を書きました。もちろん、お金をかけずに習得できる方法も解説しています。
できるだけストレスがかからない勉強法を解説しているので、ぜひ参考にしてみてくださいね。

