Python正規表現マスター:re.match、re.search、re.findallの実践例
Pythonにおける正規表現とは
正規表現(regex)は、文字列内のパターンを検索する方法をPythonに指示する簡潔なテキスト記述です。正規表現は、コードベース、ログ、設定ファイル、ウェブスクレイピングプロジェクトにおけるデータ抽出、検証、変換に不可欠です。
Pythonでは、reモジュールがインタプリタに同梱されており、パターンのコンパイル、検索、置換のための豊富なAPIを提供します。ユーザー入力のフィルタリング、ログの解析、ウェブサイトからのコンテンツスクレイピングなど、正規表現の基礎をしっかり理解すれば時間を節約しバグを減らせます。
正規表現の核心概念
- リテラル文字 – 記述したテキストと完全一致。
- メタ文字 – クラス、範囲、量指定子を表す特殊記号(例:
\d,\w,+,?,*)。 - アンカー –
^と$で文字列の先頭または末尾にパターンを固定。 - 量指定子 – トークンの繰り返し回数を指定。
- グループと選択 – 部分配列を捕捉し、複数の選択肢を許可。
- フラグ – パターンの振る舞いを調整(大文字小文字無視、複数行モード等)。
よく使う識別子一覧
| 識別子 | 説明 | 空白文字 | 特殊エスケープ |
|---|---|---|---|
| \d | 任意の数字(0-9) | \n | ., +, *, ?, [], $, ^, (, ), {}, |, \ |
| \D | 数字以外 | \s | |
| \s | スペース、タブ、改行等 | \t | |
| \S | 非空白文字 | \e | |
| \w | 英数字とアンダースコア | \r | |
| \W | 非英数字(アンダースコア除く) | \f | |
| . | 改行以外の任意の文字 | — | |
| \b | 単語境界 | — | |
| \. | リテラルのピリオド | — | |
| \{x} | ちょうどx回の出現 | — |
reモジュールの導入
import re
reモジュールはPython標準ライブラリの一部で、外部依存は不要。主なユースケース:
- 文字列検証(メールアドレス、電話番号など)
- 非構造化テキストからのデータ抽出
- 自動ウェブスクレイピング
例1: \w+と^
^– 文字列の先頭にアンカー。\w+– 1つ以上の単語文字(英字、数字、アンダースコア)。
これらを使って文字列の最初の単語を取得:
import re sample = "guru99, education is fun" result = re.findall(r"^\w+", sample) print(result) # Output: ['guru99']
+を省略すると最初の文字のみ返る: ["g"]。
例2: \sで空白文字分割
re.split()関数は、パターンが一致する箇所で文字列を分割。\sを使うと任意の空白文字で分割。
import re text = "we are splitting the words" print(re.split(r"\s", text)) # ['we', 'are', 'splitting', 'the', 'words']
バックスラッシュを省くとsがリテラルとして扱われ、すべてのsで分割される。
正規表現メソッドの概要
re.match()– 文字列の先頭のみでマッチをチェック。re.search()– 文字列全体をスキャンし、最初のマッチを返す。re.findall()– 重複しないすべてのマッチをリストで返す。
re.match()の使用
import re text = "guru99 is a great platform" match = re.match(r"^\w+", text) print(match.group() if match else "No match") # Output: guru99
re.search()の使用
import re
text = "Software Testing is fun"
for pattern in ["Software testing", "guru99"]:
found = re.search(pattern, text, re.IGNORECASE)
print(f"Looking for '{pattern}' in '{text}' - {'found a match!' if found else 'no match'}")
re.findall()の使用
import re
emails = "guru99@google.com, careerguru99@hotmail.com, users@yahoomail.com"
found = re.findall(r"[\w\.-]+@[\w\.-]+", emails)
for e in found:
print(e)
正規表現フラグ
フラグはパターンの振る舞いを変更。主なフラグ:
| フラグ | 説明 |
|---|---|
| re.M (re.MULTILINE) | ^と$を行ごとの先頭・末尾にマッチさせる。 |
| re.I (re.IGNORECASE) | 大文字小文字を区別しない。 |
| re.S (re.DOTALL) | .を改行にもマッチさせる。 |
| re.U (re.UNICODE) | Unicode対応の文字クラスを適用。 |
| re.L (re.LOCALE) | 現在のロケールに依存したクラスにする。 |
| re.X (re.VERBOSE) | パターン内で空白とコメントを許可。 |
複数行モードの例
import re text = """guru99 careerguru99 selenium""" print(re.findall(r"^\w", text)) # ['g'] print(re.findall(r"^\w", text, re.MULTILINE)) # ['g', 'c', 's']
Python 2との互換性
上記の例はすべてPython 3向けに記述。Python 2で実行する場合はprint()文をPython 2構文に置き換え、reモジュールを同様にインポートしてください。
まとめ
Python正規表現をマスターすれば、強力なテキスト処理ツールキットを手に入れられます:
- 先頭アンカー付きパターンには
re.match()を使用。 - 全局検索には
re.search()を使用。 - すべてのマッチを抽出するには
re.findall()を使用。 - フラグ(
re.IGNORECASE,re.MULTILINE等)で振る舞いを微調整。 - 展開前にRegex101等のツールでパターンをテストすることを推奨。
Python
- Python strip()メソッド完全ガイド:実践例付き
- Python str.count()マスター:文字と部分文字列のカウント実例集
- Python format()文字列を明確な例でマスター
- Python len()関数:オブジェクトの長さを測る実践ガイド
- Python String.find()メソッド完全ガイド:構文、例、代替手法
- Python round()関数を実例で徹底解説
- Python map()関数をマスター:構文、例、ベストプラクティス
- Python timeit():実行時間測定の実例付きガイド
- Python collections.Counter:効率的なカウント、更新、演算操作
- Python list.count() 完全ガイド:実践例付きで徹底解説
- Python list.index():要素の位置を検索する実践ガイド