Pythonの re.sub():文字列置換の頼れる相棒
Pythonで文字列を操作する際、特定のパターンに一致する部分を別の文字列に置き換える必要が出てくることはよくあります。そんな時に活躍するのが、re.sub()
関数です。re
は正規表現を扱うためのモジュールで、sub()
は「substitution(置換)」の略。この関数を使うことで、複雑な条件に基づいて文字列を柔軟に置換できます。
re.sub() の基本
まずは基本的な使い方を見てみましょう。re.sub()
は、以下の3つ(実際には4つですが、初心者はまず3つを意識)の引数を取ります。
- パターン (pattern): 置き換えたい文字列のパターンを正規表現で指定します。
- 置換文字列 (replacement): パターンに一致する文字列を何に置き換えるかを指定します。
- 対象文字列 (string): 置き換えを行う対象となる文字列です。
簡単な例で見てみましょう。
import re
text = "私はリンゴが好きです。リンゴは美味しい。"
new_text = re.sub(r"リンゴ", "みかん", text)
print(new_text) # 出力: 私はみかんが好きです。みかんは美味しい。
この例では、文字列 "リンゴ" を全て "みかん" に置き換えています。 r"リンゴ"
は、生の文字列リテラル(raw string literal)を使って正規表現パターンを定義しています。生の文字列リテラルは、バックスラッシュ(\
)をエスケープシーケンスとして解釈せず、文字そのものとして扱います。正規表現パターンではバックスラッシュを多用するため、生の文字列リテラルを使うのが一般的です。
正規表現を活用する
re.sub()
の真価は、正規表現パターンを使うことでより複雑な置換ができる点にあります。例えば、数字だけを削除したい場合、以下のように書けます。
import re
text = "価格は1000円です。送料は500円。"
new_text = re.sub(r"\d+", "", text)
print(new_text) # 出力: 価格は円です。送料は円。
\d+
は正規表現で、「1つ以上の数字」を意味します。re.sub(r"\d+", "", text)
は、対象文字列 text
から全ての数字を削除し、空文字列 "" に置き換える、という処理を行っています。
置換文字列に関数を指定する
さらに、re.sub()
の置換文字列には、文字列だけでなく関数を指定することもできます。これは、一致したパターンに基づいて動的に置換文字列を生成したい場合に非常に便利です。
import re
def replace_with_uppercase(match):
"""一致した文字列を大文字に変換する関数"""
return match.group(0).upper()
text = "hello world"
new_text = re.sub(r"\b\w+\b", replace_with_uppercase, text)
print(new_text) # 出力: HELLO WORLD
この例では、replace_with_uppercase
関数が置換文字列として指定されています。正規表現 \b\w+\b
は、「単語」を表します。match.group(0)
は、一致した文字列全体を取得します。つまり、このコードは、文字列内の全ての単語を大文字に変換します。
re.sub() の引数 count
re.sub()
には、4つ目の引数 count
を指定できます。これは、置き換えを行う最大回数を指定するものです。省略した場合、すべてのパターンに一致する箇所が置き換えられます。
import re
text = "apple banana apple orange apple"
new_text = re.sub(r"apple", "grape", text, count=2)
print(new_text) # 出力: grape banana grape orange apple
この例では、count=2
と指定しているため、最初の2つの "apple" だけが "grape" に置き換えられています。
まとめ
re.sub()
は、文字列置換において非常に強力なツールです。基本的な文字列の置換から、正規表現を使った複雑なパターンマッチング、関数による動的な置換まで、幅広い用途に対応できます。最初は正規表現に苦戦するかもしれませんが、re.sub()
を使いこなせるようになれば、文字列操作の幅が大きく広がるでしょう。ぜひ、色々なパターンを試して、re.sub()
をマスターしてください。