Logo Wand.Tools

正規表現ジェネレーター

正規表現を智能生成・解説し、様々な一般的なパターンマッチングをサポート

Python正規表現完全ガイド:入門から実践まで

正規表現はテキスト処理のための強力なツールであり、Pythonのデータ分析、ウェブスクレイピング、ログ処理などの分野で幅広く使用されています。このチュートリアルでは、Pythonのreモジュールを体系的に習得し、実際の例を通じてテキストデータを効率的に処理する方法をデモンストレーションします。

なぜ正規表現を学ぶのか?

正規表現はデータ処理において重要な役割を果たします:

  • データクリーニング: 乱雑なデータを素早く整形する
  • ログ分析: 重要なエラー情報を抽出する
  • フォームバリデーション: メールアドレス、電話番号などの形式をチェックする
  • ウェブスクレイピング: HTMLから特定のコンテンツを抽出する
  • テキスト前処理: 自然言語処理のためにデータを準備する

研究によると、専門的な開発者はテキスト処理タスクで正規表現を使用することで、特に複雑なテキストパターンを扱う場合に作業効率を大幅に向上させることができます。

Python reモジュールのコアメソッド詳細

1. re.match() を使用した開始位置のマッチング

import re

pattern = r"hello"
text = "hello world"
result = re.match(pattern, text)
if result:
    print("マッチ成功:", result.group())  # 出力: hello

2. re.search() による全体検索のテクニック

text = "Python最新バージョン3.9发布了" # Note: Keeping original string data
match = re.search(r'\d+.\d+', text)
if match:
    print("バージョン番号を発見:", match.group())  # 出力: 3.9

3. re.findall() による全てのマッチの抽出

contact_info = "邮箱: [email protected], 客服: [email protected]" # Note: Keeping original string data
emails = re.findall(r'[\w\.-]+@[\w\.-]+', contact_info)
print(emails)  # ['[email protected]', '[email protected]']

正規表現の構文詳細解説

コアメタ文字の使用ガイド

文字 機能説明 実際の例
. 任意の一文字にマッチ a.c → “abc”
\d 数字文字にマッチ \d\d → “42”
\w 単語文字にマッチ \w+ → “Var123”
\s 空白文字にマッチ a\sb → “a b”

量指定子システムの詳細

量指定子 マッチングルール 典型的な使用例
* ゼロ回以上繰り返す a*b → “b”, “aaaab”
+ 一回以上繰り返す a+b → “ab”, “aaaab”
{n,m} n回からm回繰り返す a{2,4}b → “aab”, “aaaab”

高度な正規表現テクニック

グループ化によるキャプチャと参照

log_entry = "2023-05-15 14:30:22 [ERROR] System crash"
match = re.match(r'(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2}) \[(\w+)\]', log_entry)
if match:
    date, time, level = match.groups()
    print(f"エラー発生日時: {date} {time}, レベル: {level}")

非貪欲マッチの実践

html_content = "<p>第一段</p><p>第二段</p>" # Note: Keeping original string data
# 貪欲モード
print(re.findall(r'<p>(.*)</p>', html_content))
# 非貪欲モード
print(re.findall(r'<p>(.*?)</p>', html_content))

前後肯定・否定先読みアサーションの応用

# 数字が続くPythonを抽出
code_text = "Python3 Python2 Python"
print(re.findall(r'Python(?=\d)', code_text))

# 数字が続かないPythonを抽出
print(re.findall(r'Python(?!\d)', code_text))

実践ケース:データの抽出と検証

電話番号抽出ツール

contact_text = "办公室: 010-87654321, 手机: 13912345678" # Note: Keeping original string data
phone_numbers = re.findall(r'\b\d{3}-\d{8}\b|\b1[3-9]\d{9}\b', contact_text)
print(phone_numbers)  # ['010-87654321', '13912345678']

パスワード強度検証ツール

def check_password_strength(password):
    """パスワードに大文字、小文字、数字が含まれ、長さが8-20文字であるかを検証"""
    pattern = r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[\w]{8,20}$'
    return re.match(pattern, password) is not None

print(check_password_strength("Secure123"))  # True
print(check_password_strength("weak"))       # False

パフォーマンス最適化と一般的な問題

  1. 正規表現の効率向上:

    • よく使うパターンはre.compile()で事前コンパイルする
    • 複雑なバックトラッキングロジックを避ける
    • 非キャプチャリンググループ(?:...)の使用を優先する
  2. 典型的なエラーの防止:

    • 特殊文字(., *, +, ?など)は正しくエスケープする必要がある
    • 貪欲マッチによる予期しない結果に注意する
    • Unicode文字を扱う場合は\uを使用してマッチさせる

常用正規表現リファレンス

  • メールアドレス検証: ^[w\.-]+@[\w\.-]+\.\w+$
  • URL認識: https?://[^\s]+
  • 漢字マッチ: [\u4e00-\u9fa5]
  • 日付抽出: \d{4}-\d{2}-\d{2}