【Python】正規表現re.subで文字列を効率的に置換する方法

Pythonで文字列の置換を行う際、単純な固定文字列の置き換えであれば標準の replace() メソッドで十分である。しかし、「すべての空白文字」や「数字だけ」といった、パターンに基づいた柔軟な置換を行いたい場合は、正規表現モジュール resub() 関数が非常に強力である。

ここでは、ユーザー入力などでスペースが含まれる文字列を、システムで扱いやすい形式(スネークケースなど)に一括変換する手法を解説する。

目次

re.sub の基本構文

re.sub は、正規表現パターンにマッチした部分を指定した文字列で置き換える関数である。

re.sub(正規表現パターン, 置換後の文字列, 対象のテキスト)

この関数を使う最大のメリットは、スペース(半角・全角)、タブ、改行などをまとめて一つの条件(メタ文字)で指定できる点にある。

実装例:ファイル名の正規化処理

ユーザーがアップロードしたファイル名などに含まれる「空白」を、システム上のトラブルを防ぐために「アンダースコア(_)」に統一して置換するコード例を示す。

import re

def main():
    # ユーザー入力されたファイル名の想定
    # 半角スペースや全角スペースが混在している
    raw_filename = "My Project Plan 2025.pdf"

    print(f"元のファイル名: '{raw_filename}'")

    # 正規表現による置換処理
    # r"\s" は「空白文字」を表すメタ文字
    # (半角スペース、全角スペース、タブ、改行などが対象)
    normalized_filename = re.sub(r"\s", "_", raw_filename)

    # 結果の出力
    print(f"正規化後の名前: '{normalized_filename}'")

    # --- 応用: 連続する空白を1つのアンダースコアにする場合 ---
    # r"\s+" とすることで、スペースが複数連続していても1つにまとめる
    messy_text = "Data    Analysis   Report.txt"
    clean_text = re.sub(r"\s+", "_", messy_text)
    print(f"連続空白の処理: '{messy_text}' -> '{clean_text}'")

if __name__ == "__main__":
    main()

コードの解説

メタ文字 \s の威力

コード内で使用している正規表現 r"\s" は、Unicodeにおける「空白文字」全般にマッチする。これには以下のものが含まれる。

  • 半角スペース ()
  • タブ (\t)
  • 改行 (\n, \r)
  • 全角スペース(日本語環境で特によく使われる)

通常の replace(" ", "_") では半角スペースしか置換できず、全角スペースやタブが残ってしまうが、re.sub(r"\s", ...) を使えばこれらを一網打尽に処理できる。

Raw文字列 r"..." の推奨

正規表現パターンを記述する際は、文字列の先頭に r を付けた Raw文字列 を使用することが推奨される。これは、バックスラッシュ(\)をエスケープ文字としてではなく、文字そのものとして扱うためである。Pythonにおいて正規表現を扱う際の基本作法として定着している。

まとめ

re.sub を使用することで、単純な文字の一致だけでなく、文字種やパターンに応じた高度な置換処理が可能になる。

  • \s: あらゆる空白文字を対象にする。
  • \d: 数字を対象にする(例:個人情報の数字をマスクするなど)。
  • +: 直前のパターンの繰り返しを許容し、連続する文字をまとめて置換する。

データのクレンジングやフォーマット統一において、非常に使用頻度の高い関数である。

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

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次