Pythonで文字列の置換を行う際、単純な固定文字列の置き換えであれば標準の replace() メソッドで十分である。しかし、「すべての空白文字」や「数字だけ」といった、パターンに基づいた柔軟な置換を行いたい場合は、正規表現モジュール re の sub() 関数が非常に強力である。
ここでは、ユーザー入力などでスペースが含まれる文字列を、システムで扱いやすい形式(スネークケースなど)に一括変換する手法を解説する。
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: 数字を対象にする(例:個人情報の数字をマスクするなど)。+: 直前のパターンの繰り返しを許容し、連続する文字をまとめて置換する。
データのクレンジングやフォーマット統一において、非常に使用頻度の高い関数である。
