Python
2022.02.02
【Python入門】文字列を置換する方法!replaceの使い方
2023.11.15


Pythonでは、文字列を置換するためのメソッドが複数存在します。

この記事では各メソッドの特徴、使い分けについて紹介していきます。


1.Pythonで文字列を置換するには

Pythonで文字列を置換するのに用いられるメソッドはreplace、translate、re.subが挙げられます。

各メソッドの特徴や利用例を見てみましょう。

 replacetranslatere.sub
特徴・文字列の置換が可能
・引数で指定した文字列を置換する
・置換元が複数ある場合は、回数を指定可能
・初心者でも扱いやすい
・単純な変換に使いやすい
・文字(長さが1の文字列)を指定して置換する
・maketransメソッドを用いる
・他メソッドと異なり回数指定ができない
・一度に複数の置換を指定することができる
・文字列の置換が可能
・正規表現を用いることで完全一致でなく部分一致で元の文字列を指定できる
・置換元が複数ある場合は、回数を指定可能
利用例・同じ文字列が複数出てくる場合・複数の置換を一度に行う場合・変換したい元の文字列が微妙に異なっている場合


これ以外にも、大文字小文字等の特殊な変換に特化したメソッドも存在します。


上記の表だけで理解するのは難しいと思うので、ここからは各メソッドについて、実際のソースコードを交えて使い方を紹介していきます。

2.replaceメソッドで文字列を指定して置換する


replaceメソッドは、文字列を置換するための一番ベーシックなメソッドです。

はじめにreplaceメソッドの使い方をマスターしておきましょう。

①基本的な使い方

replaceメソッドでは第一引数に置換元文字列(str)、第二引数に置換後文字列(str)を指定します。replaceはstr型のメソッドであり、文字列.replace()という形で使用します。

実際の例を見てみましょう。

# 文字列.replace("置換元文字列","置換後文字列")

string = "Hello World!! Hello Python"
print(string.replace("Hello", "Hey!!"))
# Hey!! World!! Hey!! Python

まず、stringという変数に”Hello World!! Hello Python”という文字列を格納しています。次に、第一引数に”Hello”、第二引数に”Hey!!”を入れてreplaceメソッドを実行しました。


その結果、string内の”Hello”が”Hey!!”に変更されていますね。


こちらが最も単純なreplaceメソッドの使い方になります。ここからは発展的な使い方を紹介していきます。

②引数に変数を用いる

先ほどの例とは異なり、引数を変数にして実行した場合が以下になります。

string = "Hello World!! Hello Python"
st1 = "Hello"
st2 = "Hey!!"

print(string.replace(st1, st2))
# Hey!! World!! Hey!! Python

replaceメソッドでは、変数を引数に用いても問題なく利用できます。

③文字列を空文字に変換する

第一引数に変数を設定できることを上記で紹介しました。元の文字列を格納している変数も例外ではないので、文字列の一括変換ができます。


また、第二引数を””(空文字)にすることで文字列を空文字にすることも可能です。

string = "Hello World!! Hello Python"

print(string.replace(string, ""))
# 

④回数を指定して置換を行う

これまでは第一引数に置換元文字列、第二引数に置換後文字列を指定するという例を見せてきましたが、replaceには第三引数(int型)を設定することもできます。

string = "Hey Hey Hey Python!!"

print(string.replace("Hey", "Hoo", 2))
# Hoo Hoo Hey Python!!

第三引数を設定することで、指定の回数のみ置換できます。上記の例では前2つの”Hey”を”Hoo”に置換し、3つ目の”Hey”はそのままになっていることがわかりますね。

⑤リストの中身を置換する

下記の例ではリスト「name_list」の中の値”o”を、一括で”a”に変換しています。

name_list = ["Taro", "Jiro", "Saburo", "Shiro"]
replace_list =[string.replace("o", "a") for string in name_list]

print(replace_list)
# ['Tara', 'Jira', 'Sabura', 'Shira']

replace_list内は内包表記で記載しています。このように、replaceは文字列だけでなくリスト内の要素に対しても使えるのです。

⑥複数の文字列を置換する

下記の例では一度”Hey”を”Hoo”に変換し、さらに”Hoo”を”Yeah!”に変換しています。

string = "Hey Hey Hey Python!!"

string2 = string.replace("Hey", "Hoo").replace("Hoo", "Yeah!")
print(string2)
# Yeah! Yeah! Yeah! Python!!
#複数のメソッドがprint内に入ると複雑に見えるので、外に出していますが特に意味はありません

このように、変換したものを直接変換できます。

上記例のように使うことはあまりありませんが、以下の使い方は使えるのではないでしょうか。

string = "He has a pen."

string2 = string.replace("He", "She").replace("pen", "book")
print(string2)
# She has a book.

このように複数の単語を変換できます。置換する文字列の長さが1の場合は、後述するtranslateやre.subを用いて置換するのが一般的です。


3.translateメソッドで複数の文字列を置換する

ここからはtranslateメソッドについて紹介します。translateメソッドは引数にした文字(長さ1の文字列)を置換します。

①基本的な使い方

先ほども簡単に説明した通り、translateメソッドは長さ1の文字列(文字)を指定して置換できます。指定する変換表をstr.maketransメソッドで作成することで、複数指定することが可能です。


文字だけではわかりにくいので、さっそく使い方を見ていきましょう。

string = "hi hi hi python!!"
print(string.translate(str.maketrans({"h": "H", "p": "P", "i": "ey!!"})))
# Hey!! Hey!! Hey!! PytHon!!

このように複数の文字を一括で変換することが可能になります。また上記例で”i”を”ey!!”と変更しているように、置換後は一文字でなくても動作します。

②別の指定方法

先ほどの例では変換表を辞書型で渡しましたが、以下のような渡し方も可能です。

string = "hi hi hi python!!"
print(string.translate(str.maketrans({"h": "H", "p": "P", "i": "ey!!"})))
# Hey!! Hey!! Hey!! PytHon!!

maketransメソッド内の第一引数に置換元の文字を連結した文字列、第二引数に置換後の文字を連結した文字列を与えることで置換しています。この場合、第一引数の一文字目”h”が第二引数の一文字目”H”に、第一引数の二文字目”i”が第二引数の二文字目に”I”に…といった形で置換されていきます。


この方法で置換する場合は、第一引数と第二引数の文字数が一致していないとエラーが発生してしまうので注意が必要です。


また、この方法では第三引数に文字列を与えることも可能になります。実際の例を見てみましょう。

string = "hi hi hi python!!"
print(string.translate(str.maketrans("hi", "HI", "!!")))
# HI HI HI pytHon

第一引数、第二引数は先ほどの例同様で、第三引数に”!!”を与えました。実行結果からわかるように、置換元の文字列から”!!”を削除した文字列内で置換を行っています。


文章ではわかりにくいと感じる方は以下の図をご覧ください。

このような流れで置換されています。

※あくまでイメージです。

③文字列をスワップする

translateメソッドではreplaceメソッドとは異なり、順番に置換していくわけではありません。そのため、置換元の文字列が別の文字列として一致していても問題なくスワップできます。


実際のソースコードを見ていきましょう

string = "hi hi hi python!!"
print(string.translate(str.maketrans({"i": "o", "o": "a"})))
# ho ho ho pythan!!

上記の例では”i”⇒”o”、”o”⇒”a”に置換しています。replaceメソッドと異なり順番に置換していくわけではないので、元々”i”だったものは”a”に変換されません。

4.re.subメソッドで正規表現を使って置換する


これまでreplaceメソッド、translateメソッドの使い方を学習してきました。ふたつのメソッドでは置換元文字列と置換後文字列を用いて置換を行いましたね。


しかしre.subメソッドでは正規表現を使います。そもそも正規表現とは一体なんなのかを、まずは確認してみましょう。

①正規表現とは

正規表現とは文字列をパターン化し表現する記法のことを言います。


replaceメソッドなどではパターンではなく文字列を指定して置換していたので、少しでも異なる文字列だった場合は置換できませんでした。しかしre.subメソッドではパターンで指定するので、同じパターンの文字列は一括で変換することが可能になります。


正規表現においてパターン化した文字列をメタ文字と言いますが、メタ文字の種類は多すぎるので、今回は代表的なものを用いてサンプルコードを紹介します。

②基本的な使い方

今までのreplace、translateはstr型のメソッドでした。しかし今回使うsub関数はreモジュールの関数であるためインポートして使用する必要があります。reモジュールは標準ライブラリなので特別な準備をすることなく利用できます。


実際のソースコードを見ていきましょう。

import re

string = "Hi Hey Hoo python!!"
print(re.sub("H[a-z]*","Yeah!!", string))
# Yeah!! Yeah!! Yeah!! python!!

re.subメソッドの第一引数は正規表現で表す置換元文字列、第二引数は置換後文字列、第三引数に対象文字列を指定します。


今回使用した正規表現では”H”の後にa-zの小文字が続く箇所を一括で指定しています。

そのため”Hi”、”Hey”、”Hoo”すべてが対象になり、”Yeah”に置換されました。

③最大置換数を指定する

re.subメソッドでも回数を指定して置換を行うことができます。まずは実際のソースコードを見ていきましょう。

import re

string = "Hi Hey Hoo python!!"
print(re.sub("H[a-z]*","Yeah!!", string, 2))
# Yeah!! Yeah!! Hoo python!!

こちらは先ほどの例の第四引数に最大置換数を与えた例になります。先ほどは”Hoo”も”Yeah”に置換されていましたが、今回は2回と指定したため置換されていません。このように最大置換数を指定できます。

④マッチした部分を使って置換

ここからは少し応用的な方法を紹介していきます。はじめに以下の例をご覧ください。

import re

string = "Taro Jiro Saburo Shiro"
print(re.sub("(ro)","\\1maru", string))
# Taromaru Jiromaru Saburomaru Shiromaru

こちらの例では該当箇所の後ろの空欄を“maru”に変換しています。複雑な内容なので、図で確認していきましょう。

このように条件に()を付けることで、マッチする文字列を使用できます。マッチする箇所が複数の場合は、\\2、\\3のように続けて指定することも可能です。

⑤複数の文字列を置換する

ここからは正規表現にあまり詳しくない人でも使いやすい書き方を紹介していきます。はじめに複数の文字列を同じ文字列に変換する方法です。


ソースコードは以下のようになります。

import re

string = "Hi Hey Hoo python!!"
print(re.sub("Hi|Hey|Hoo","Yeah!!", string))
# Yeah!! Yeah!! Yeah!! python!!

このように”|”を用いることで、複数の文字列を直接指定することが可能です。


正規表現を使っていきたいという方は、以下のような簡単な正規表現から使ってみてはいかがでしょうか。

import re

string = "Hi Hey Hoo python!!"
print(re.sub("[a-e]","XXX", string))
# Hi HXXXy Hoo python!!

この例ではa-eの文字があった場合、”XXX”に置換しています。正規表現を使うと指定できる幅が広がりますので、ぜひ合わせて勉強してみてはいかがでしょうか。


5.replaceメソッドで置換できない場合


これまでは各メソッドを用いた置換方法を紹介してきました。ここからはreplaceメソッドで正しく置換できない場合を紹介していきます。


置換がうまくいかない場合は、こちらを参考にしてみてください。

①大文字/小文字を確認

replaceメソッドに入れる引数では大文字、小文字が区別されます。以下の例を見ていきましょう。

string = "TARO Taro taro"
print(string.replace("Taro", "Jiro",))
# TARO Jiro taro

ご覧の通り、真ん中の”Taro”しか変換されません。このように大文字、小文字を区別して置換されるので注意してください。

②置換したい文字が存在するか確認

置換したい文字が置換元文字列にない場合も正しく置換を行うことができません。

string = "TARO Taro taro"
print(string.replace("JIRO", "Jiro",))
# TARO Taro taro

元々の文章に”JIRO”はないので、置換が行われませんでした。





この記事をシェア