Pythonの文字列置換まとめ|replace, translate, re.sub, スライス

Pythonで文字列を置換する方法(メソッド、関数、スライス)をまとめて解説します。それぞれ特徴があるので、違いを理解しながらおさえていきましょう。

目次

1. 任意の文字列を指定して置換(replaceメソッド)

Pythonで任意の文字列を置換するには文字列型メソッドのreplace()を使います。

メソッドの第一引数に置換したい文字列を、第二引数に新しい文字列を渡します。確認しましょう。

1.1. 一つの文字列を別の一つの文字列に置換

In [1]:
''' replaceメソッドで指定の文字を置換します。'''
fruits = 'apple banana cherry durian figs'

''' 第一引数で置換する文字、第二引数で新しい文字を渡す。'''
print(fruits.replace(' ', '-'))  #  空白をハイフン(-)で置換
print(fruits.replace(' ', ''))  #  空白を空文字で置換
print(fruits.replace('apple', 'apricot'))  #  appleをapricotで置換
apple-banana-cherry-durian-figs
applebananacherrydurianfigs
apricot banana cherry durian figs

このように任意の文字列を、新しい別の文字列に置換することができます。なお以下のように第三引数で置換回数を指定することができます。

In [2]:
''' 第三引数で置換回数を指定することができます。 '''
print(fruits.replace(' ', '-', 1))  #  置換回数1回
print(fruits.replace(' ', '-', 2))  #  置換回数2回
apple-banana cherry durian figs
apple-banana-cherry durian figs

1.2. 複数の文字列を別の複数の文字列に置換

文字Aを文字Bに、文字Cを文字Dにというように複数の文字列を別の複数の文字列に置換したい場合はreplaceメソッドを重ねて使う方法があります。

In [1]:
'''replaceメソッドを重ねて使うと複数の文字を置換することができます。 '''
text = 'これは文字列となります。つまりstr型オブジェクトだ。'
print(text)
print(text.replace('となります', 'です').replace('だ', 'です'))
これは文字列となります。つまりstr型オブジェクトだ。
これは文字列です。つまりstr型オブジェクトです。

「となります」を「です」に、「だ」を「です」にそれぞれ置換することができました。

この方法を使うと、例えば、次のように複数の改行コード(\nと\r\n)が入り乱れているような場合でもうまく削除することができます。

In [2]:
''' 改行コードが入り乱れていても一度に置換(削除)できます。 '''
tanka = 'ふるさとの\r\n山に向ひて\n言ふことなし\r\nふるさとの山は\nありがたきかな'
print(tanka)

print('\n')  #  ←見やすいように改行を入れています。

print(tanka.replace('\r\n', '').replace('\n', ''))
ふるさとの
山に向ひて
言ふことなし
ふるさとの山は
ありがたきかな


ふるさとの山に向ひて言ふことなしふるさとの山はありがたきかな

ただし順番を間違えると、次のように意図せぬ結果になってしまうので非常に注意が必要です。

In [3]:
''' しかし順番を間違えると意図せぬ結果になってしまいます。 '''
print(tanka.replace('\n', '').replace('\r\n', ''))
ふるさとの山はありがたきかな

このように数種類の改行コード(例:\n, \t, \r, \r\n等)を削除したい場合は、replace()の重ねがけではなく、join()とsplitlines()の重ねがけの方が安心です。

In [4]:
''' splitlines()とjoin()を利用すると、そうした不安はありません。 '''
print(''.join(tanka.splitlines()))
ふるさとの山に向ひて言ふことなしふるさとの山はありがたきかな

両メソッドについては、以下で解説しています。

ぜひご確認ください。

2. 複数の一文字を一度に別の一文字に置換(translateメソッド)

複数の一文字を、一度に別の新しい複数の一文字に置換する時は、文字列型メソッドのtranslate()を使います。

このtranslateメソッドは、変換テーブルを作成する関数のstr.maketrans()と組み合わせて使います。

なお、translateメソッドで変換することができるのは一文字の長さの文字だけです。置換したい文字も新しい文字も二文字以上の場合には使うことはできませんのでご注意ください。

それでは実際にコードを見てみましょう。

In [1]:
''' 複数の一文字を一括で変換したい時はtranslateメソッドを使います。 '''

#  次の文字列を例に解説します。
text = 'Pythonは,AI・科学技術計算・機械学習に適した言語です.++'
print(text)

''' translateメソッドは変換テーブルを作るstr.maketrans関数と一緒に使います。'''
#  ','を'、'に、'・'を'と'に、'.'を'。'に一括変換します。
print(text.translate(str.maketrans({',' : '、', '・' : 'と', '.' : '。', '+' : None})))
Pythonは,AI・科学技術計算・機械学習に適した言語です.++
Pythonは、AIと科学技術計算と機械学習に適した言語です。

一度の操作でカンマ(,)を読点(、)に、丸点(・)を「と」に、ピリオド(.)を句点(。)に、「+」をNone(=削除)に一括で変換することができました。

このようにtranslate()で置換する時は、その引数にstr.maketrans()を渡します。そして、str.maketrans()の引数に、置換したい一文字と新しい一文字をペアで辞書型で渡します。辞書については以下のページで確認しましょう。

str.maketrans()の引数は辞書型で渡さなくても、次のように、第一引数に置換する一文字、第二引数に新しい一文字をそれぞれ連続して渡して、第三引数で削除したい文字を渡す方法もあります。

In [2]:
''' str.maketransには第一引数に置換する文字、第二引数に入れ替える文字を
まとめて一括で渡し、第三引数に削除する文字を渡すこともできます。'''

print(text.translate(str.maketrans(',・.', '、と。', '+')))
Pythonは、AIと科学技術計算と機械学習に適した言語です。

どちらか使いやすい方を選ぶと良いでしょう。

3. 複数の文字列を一度に別の一つの文字列に置換(re.sub関数)

複数の文字列を、別の一つの文字列に一括で置換したい場合はreモジュールのre.sub関数を使います。モジュールについては以下で解説しています。

早速、使用例を見てみましょう。

In [1]:
''' re.sub関数では複数の文字を一度に新しい文字に置換することができます。 '''

import re  #  ←必ずreモジュールをインポートする。

#以下の文字列を参考に解説します。
text = '関東のおみず、関西のみず、東北のおミズ、九州のミズ'
print(text)

#第一引数に置換したい文字、第二引数に新しい文字、第三引数に文字列。
print(re.sub('おみず|みず|おミズ|ミズ', '水', text))

#第四引数で置換回数を指定することができます。
print(re.sub('water|みず|ミズ|aqua', '水', text, 2))
関東のおみず、関西のみず、東北のおミズ、九州のミズ
関東の水、関西の水、東北の水、九州の水
関東のお水、関西の水、東北のおミズ、九州のミズ

このように、re.sub関数を使うと複数の文字列を、一括してある一つの文字列に置換することができます。置換したい複数の文字列は縦線 | で区切ります。

re.sub関数は正規表現を扱うことができます。そのため、正規表現を使えるなら、よりシンプルな記述で様々な文字列置換を行うことができます。いくつか例を見てみましょう。

In [1]:
''' 正規表現を使うとよりシンプルな表記が可能です。'''

import re

#  以下の文字列を参考に解説します。
text = "abc123def456efg"

#  全てのアルファベットを0に置換
print(re.sub(r'[a-z]', '0', text))

#  全てのアルファベットを一つの0に置換
print(re.sub(r'[a-z]{3}', '0', text))

#  全ての数値を_に置換
print(re.sub(r'\d', '_', text))

#  全ての数値を一つの_に置換
print(re.sub(r'\d{3}', '_', text))
000123000456000
012304560
abc___def___efg
abc_def_efg

次のように不揃いのドメインを一括で変換したり、郵便番号の表記を7桁から3桁-4桁方式に変換することができるようにもなります。

In [1]:
''' 正規表現を使うと様々な高度な置換が可能です。'''
import re

#  ドメインをexampleに置換
address = '''
x@xxx.com
y@xxxyyy.com
z@xxxyyyzzz.com
'''
print(re.sub(r'[x-z]{3,9}', 'example', address))


#  郵便番号を3桁-4桁表記に置換
postal = """
1234567 Tokyo
3334444 Kanagawa
9876543 Osaka
"""
print(re.sub(r'([0-9]{3})([0-9]{4})', r'\1-\2', postal))
x@example.com
y@example.com
z@example.com


123-4567 Tokyo
333-4444 Kanagawa
987-6543 Osaka

reモジュールの関数はもともと正規表現を扱うためのものです。正規表現はマスターするのにある程度の学習が必要なので、その学習後に再度reモジュールを見てみると、できることが大きく増えます。

正規表現を初めて見た方は難しく見えるかもしれませんが、プログラミングは慣れでしかないので粘り強く一つずつ学習していきましょう。

4. 文字列のスライスと+演算子で置換する

メソッドや関数を使わずに、文字列のスライスと+演算子の組み合わせで置換することもできます。次の例では「嫉妬心」を「創造性」に、「壊す」を「変える」に置換しています。

In [1]:
''' スライスと連結を利用して新たな文字列を作ることができます。 '''
text = '人間の嫉妬心が世界を壊す'
print(text)
new_text =  text[0:3]+'創造性'+text[6:10]+'変える'
print(new_text)
人間の嫉妬心が世界をこわす
人間の創造性が世界を変える

この方法は、異なる文字列を連結しているだけなので、特に何の縛りもなく自由に任意の文字列を置換することができます。どうしてもメソッドや関数を使って処理できない場合は、こちらを使っても良いでしょう。

なお文字列のスライスや連結については以下をご確認ください。

5. まとめ

replaceメソッドは任意の文字列を別の文字列に置換するメソッドです。これを重ねて使うことで、複数の文字列を同時に別の複数の文字列に置換することもできます。

もし、文字列ではなく複数の一文字を、別の複数の一文字に置換したい場合は、translateメソッドを使います。

そして、複数の文字列を別の一つの文字列に一括で変換したい時や、正規表現を使いたい場合は、reモジュールのre.sub関数を使います。

それぞれ使いこなせるようになると、様々な文字列置換の処理を行えるようになります。一つずつマスターしていきましょう。



よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次
閉じる