
Pythonを使ってデータ処理や分析をしていると、こんな場面に出くわしたことはありませんか。
- テキストから 数字だけ 抜き出したい
- メールアドレスや電話番号を自動で検出したい
- CSVやログファイルの中で特定のパターンを一括置換したい
こうした「パターンに基づいた文字列操作」を効率的に行うための最強ツールが、正規表現(Regular Expression / regex) です。Pythonでは標準ライブラリのreモジュールを使えば、追加インストールなしで簡単に利用できます。
この記事では、正規表現の基本構文から、実務レベルで役立つテクニックまで、初心者でも理解できるよう丁寧に解説します。
目次
正規表現とは

文字列操作の「魔法のルール」
正規表現とは、文字列のパターンを表すための特別な記法です。例えば、次のような複雑な条件をわずか1行で指定できます。2〜4桁の数字のあとにハイフンが続き、さらに数字が並びます。
例:電話番号を自動抽出する
import re
text = “お問い合わせは 03-1234-5678 までご連絡ください。”
pattern = r”\d{2,4}-\d{2,4}-\d{3,4}”
result = re.findall(pattern, text)
print(result) # [’03-1234-5678′]
r”\d{2,4}-\d{2,4}-\d{3,4}” というパターンが、数字(2~4桁)+ハイフン+数字+ハイフン+数字という形に一致する部分を抽出しています。
Pythonで正規表現を使う準備
Pythonの正規表現は reモジュール を使います。特別なライブラリをインストールする必要はありません。
import re
これだけで準備完了です。以降は、re が提供する関数を使って検索・抽出・置換などを行います。
よく使うreモジュールの関数一覧

| 関数名 | 機能 | 例 |
| re.search() | 最初にマッチした1件を返す | re.search(r”\d+”, text) |
| re.findall() | すべての一致をリストで返す | re.findall(r”\d+”, text) |
| re.sub() | 一致部分を別の文字列に置換 | re.sub(r”\d”, “X”, text) |
| re.split() | 正規表現で文字列を分割 | re.split(r”[,;]”, text) |
| re.match() | 文字列の先頭のみを判定 | re.match(r”\d+”, text) |
初心者はまず、findall() と sub() の2つをマスターしましょう。この2つを覚えるだけで、データ整形・ログ解析・自然言語処理の前処理が劇的に楽になります。
正規表現の基本構文まとめ

以下はよく使う「メタ文字」と呼ばれる記号一覧です。
| メタ文字 | 意味 | 例 |
| . | 任意の1文字 | a.b → aとbの間に1文字 |
| \d | 数字(0~9) | \d+ → 数字1文字以上 |
| \w | 英数字とアンダースコア | \w+ → 単語 |
| \s | 空白文字 (スペース・タブなど) |
\s+ → 1文字以上の空白 |
| ^ | 行の先頭 | ^Hello → Helloで始まる行 |
| $ | 行の末尾 | world$ → worldで終わる行 |
| [] | 文字クラス(どれか1つ) | [abc] → aまたはbまたはc |
| {n,m} | 繰り返し回数 | \d{3,4} → 3~4桁の数字 |
| | | | | または(OR条件) |
実践①:メールアドレスを抽出する
メールアドレスのように一定の規則がある文字列は、正規表現の得意分野です。
text = “””
担当者一覧:
suzuki@example.com
tanaka@abc.co.jp
“””
pattern = r”[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-z]{2,}”
emails = re.findall(pattern, text)
print(emails)
# [‘suzuki@example.com’, ‘tanaka@abc.co.jp‘]
このように、複雑な条件でもたった1行のパターンで抽出可能です。Webスクレイピングやメール解析の前処理に重宝します。
実践②:不要な改行や記号を削除する
文章整形においても、正規表現は非常に応用できます。
# 改行・タブを削除
text = “Hello\nWorld\tPython”
cleaned = re.sub(r”[\n\t]”, ” “, text)
print(cleaned)
# Hello World Python
# 記号を削除
text = “Hello!!! Python??? (regex)”
cleaned = re.sub(r”[!?\(\)]”, “”, text)
print(cleaned)
# Hello Python regex
re.sub() は replace() より柔軟で、複数条件をまとめて処理できます。
実践③:複数の条件で同時に置換
例:数字をすべて「###」に置き換えたい場合:
text = “価格は1000円、送料は500円です。”
new_text = re.sub(r”\d+”, “###”, text)
print(new_text)
# 価格は###円、送料は###円です。
このように、 \d+(数字1文字以上)を使えば、桁数に関係なく一括置換できます。
実践④:日付データを抽出・統一する
データ分析では、日付形式を揃える作業があり、正規表現が役立ちます。
text = “本日: 2024/05/01、明日: 2024-05-02”
dates = re.findall(r”\d{4}[-/]\d{2}[-/]\d{2}”, text)
print(dates)
# [‘2024/05/01’, ‘2024-05-02’]
続いて、フォーマットを統一します。
cleaned = [re.sub(r”/”, “-“, date) for date in dates]
print(cleaned)
# [‘2024-05-01’, ‘2024-05-02’]
これでデータベースやCSVへの出力がスムーズになります。
実践⑤:AIや機械学習の前処理で活用する
自然言語処理(NLP)では、学習前に不要な文字を削除する「クレンジング」が欠かせません。
text = “【速報】AIが進化!\n\nPython3.11登場 #AI #Python”
text = re.sub(r”[【】#]”, “”, text) # 特定記号削除
text = re.sub(r”\n+”, ” “, text) # 改行をスペースに変換
print(text)
# 速報AIが進化! Python3.11登場 AI Python
このように、ノイズを除去することで、形態素解析や感情分析の精度が向上します。
正規表現を使うときの注意点

パターンが複雑になりすぎないようにする
正規表現は、短いコードで柔軟な検索や置換ができる非常に強力な機能ですが、便利な反面「読みづらい」「後から修正しにくい」といった問題も起こりがちです。
例えば、1行に複雑なパターンを詰め込みすぎると、数日後には自分でも何をしているのか分からなくなることがあります。
そんなときは、以下のようにコメント付き正規表現を使うのがおすすめです。
import re
pattern = re.compile(r”””
^ # 行頭
[A-Z]{3} # 英大文字3文字
– # ハイフン
\d{4} # 数字4桁
$ # 行末
“””, re.VERBOSE)
result = re.match(pattern, “ABC-1234”)
このように、re.VERBOSE フラグを使えば、正規表現内にコメントを記述できるため、 「後で読む人にも優しい」コードになります。また、よく使うパターンを変数に切り出しておくと、可読性がさらに向上します。
raw文字列(r”…”)
正規表現では、\d(数字)、\s(空白)などのように バックスラッシュ(\) を多用します。ただし、Pythonの文字列でも \ は「エスケープ文字」として使われるため、意図しない動作を引き起こすことがあります。
例えば、以下のコードは思った通りに動きません。
import re
text = “ID: 1234”
result = re.search(“\d+”, text) # これは警告の原因に!
この場合、\d がPythonのエスケープ文字として解釈されてしまう可能性があります。正しくは raw文字列(生文字列)を使いましょう。
result = re.search(r”\d+”, text) # 正しい書き方
文字列の前に r を付けることで、バックスラッシュを「そのままの文字」として扱うことができます。特に、正規表現では必須の習慣です。
文字コードの統一
日本語を含むテキストを扱う場合、エンコーディング(文字コード)が異なると正規表現がうまく機能しないことがあります。
特に、Windows環境とMac/Linux環境では、デフォルトの文字コードが異なるため、思わぬエラーが発生するケースも起こりえます。そのため、UTF-8で統一するのが最も安全です。
例えば、ファイルを開く際には以下のように指定します。
with open(“data.txt”, “r”, encoding=”utf-8″) as f:
text = f.read()
また、文字列の途中でエンコーディングが混在している場合は、str.encode() や bytes.decode() を使って整えておくと安心です。
まとめ
Pythonで文字列操作を効率的に行いたいなら、正規表現(Regular Expression) は避けて通れません。一見難しそうに見えますが、使い方をマスターすれば「検索・抽出・置換・整形」などの作業を圧倒的なスピードで処理できるようになります。
正規表現を理解することで、データ整形や検索処理の効率が飛躍的に向上し、業務の自動化にも大きく役立ちます。
もし「自社のデータ処理を自動化したい」「正規表現を使ったログ解析やレポート生成を仕組み化したい」といった実践的な課題があれば、ぜひお気軽に3inkご相談ください。
あなたの業務内容に合わせて、最適なPythonスクリプトや分析ツールの開発をご提案いたします。
