Python正規表現reモジュールの使い方完全ガイド

Pythonの正規表現reモジュールの基本的な使い方から、パターンマッチ、文字列抽出、置換まで具体例で解説。初心者でも理解できる実践的なガイド。

Python正規表現reパターンマッチ文字列抽出2026/5/25

はじめに

Pythonで文字列処理を行う際、正規表現は非常に強力なツールです。reモジュールを使うことで、パターンマッチ、文字列の抽出、置換などを柔軟に行えます。この記事では、reモジュールの基本的な使い方から、よく使う関数やメソッド、正規表現パターンの書き方までを具体例を交えて解説します。

reモジュールのインポート

まずはreモジュールをインポートします。

import re

基本関数

re.match()

文字列の先頭がパターンにマッチするか判定します。

pattern = r'Hello'
text = 'Hello World'
match = re.match(pattern, text)
if match:
    print('マッチしました:', match.group())
else:
    print('マッチしませんでした')

出力:

マッチしました: Hello

re.search()

文字列全体からパターンにマッチする最初の部分を検索します。

pattern = r'World'
text = 'Hello World'
search = re.search(pattern, text)
if search:
    print('見つかりました:', search.group())

出力:

見つかりました: World

re.findall()

パターンにマッチするすべての部分をリストで返します。

pattern = r'\d+'
text = '電話番号: 03-1234-5678'
numbers = re.findall(pattern, text)
print(numbers)  # ['03', '1234', '5678']

re.finditer()

マッチオブジェクトのイテレータを返します。マッチした位置やグループ情報が必要な場合に便利です。

pattern = r'\d+'
text = '電話番号: 03-1234-5678'
for match in re.finditer(pattern, text):
    print(match.group(), match.start(), match.end())

出力:

03 5 7
1234 8 12
5678 13 17

re.sub()

パターンにマッチする部分を別の文字列で置換します。

pattern = r'\d+'
text = '電話番号: 03-1234-5678'
result = re.sub(pattern, 'XXX', text)
print(result)  # 電話番号: XXX-XXX-XXX

re.split()

パターンで文字列を分割し、リストを返します。

pattern = r'\s+'
text = 'Python 正規表現 使い方'
words = re.split(pattern, text)
print(words)  # ['Python', '正規表現', '使い方']

正規表現パターンの基本

文字クラス

  • [abc]: a, b, cのいずれか
  • [a-z]: 小文字アルファベット
  • [0-9]: 数字
  • [^abc]: a, b, c以外
  • メタ文字

  • .: 任意の1文字(改行を除く)
  • *: 0回以上の繰り返し
  • +: 1回以上の繰り返し
  • ?: 0回または1回
  • {n}: n回
  • {n,}: n回以上
  • {n,m}: n回以上m回以下
  • ^: 文字列の先頭
  • $: 文字列の末尾
  • \d: 数字([0-9])
  • \D: 数字以外
  • \w: 単語構成文字(英数字とアンダースコア)
  • \W: 単語構成文字以外
  • \s: 空白文字(スペース、タブ、改行)
  • \S: 空白文字以外
  • \b: 単語の境界
  • \B: 単語の境界以外
  • グループ化とキャプチャ

    ()でグループ化し、キャプチャできます。

    pattern = r'(\d{3})-(\d{4})-(\d{4})'
    text = '電話番号: 03-1234-5678'
    match = re.search(pattern, text)
    if match:
        print('全体:', match.group(0))  # 03-1234-5678
        print('市外局番:', match.group(1))  # 03
        print('市内局番:', match.group(2))  # 1234
        print('加入者番号:', match.group(3))  # 5678
    

    名前付きグループも使えます。

    pattern = r'(?P<area>\d{3})-(?P<city>\d{4})-(?P<sub>\d{4})'
    text = '電話番号: 03-1234-5678'
    match = re.search(pattern, text)
    if match:
        print(match.group('area'))  # 03
    

    コンパイル済み正規表現

    同じパターンを何度も使う場合は、re.compile()でコンパイルしておくと高速です。

    pattern = re.compile(r'\d+')
    text = 'abc123def456'
    numbers = pattern.findall(text)
    print(numbers)  # ['123', '456']
    

    フラグ

    re.IGNORECASEre.MULTILINEなどのフラグを指定できます。

    <h1>大文字小文字を区別しない</h1>
    pattern = re.compile(r'hello', re.IGNORECASE)
    print(pattern.search('Hello'))  # マッチ
    

    <h1>複数行モード(^と$が各行の先頭・末尾にマッチ)</h1> text = 'line1\nline2\nline3' pattern = re.compile(r'^line\d', re.MULTILINE) print(pattern.findall(text)) # ['line1', 'line2', 'line3']

    実践例

    メールアドレスの抽出

    pattern = r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
    text = '連絡先: example@test.com, info@sample.org'
    emails = re.findall(pattern, text)
    print(emails)  # ['example@test.com', 'info@sample.org']
    

    URLの抽出

    pattern = r'https?://[\w./%-]+'
    text = 'サイト: https://example.com/path?query=1'
    urls = re.findall(pattern, text)
    print(urls)  # ['https://example.com/path?query=1']
    

    電話番号のフォーマット変換

    text = '電話: 03-1234-5678'
    pattern = r'(\d{2,4})-(\d{4})-(\d{4})'
    result = re.sub(pattern, r'\1-\2-\3', text)  # そのまま
    <h1>またはハイフンを削除</h1>
    result2 = re.sub(pattern, r'\1\2\3', text)
    print(result2)  # 電話: 0312345678
    

    注意点

  • バックスラッシュを使うパターンでは、生文字列(r'...')を使うことを推奨します。
  • 正規表現は複雑になりがちなので、コメントやテストを活用しましょう。
  • 巨大なテキストに対しては、パフォーマンスに注意が必要です。
  • まとめ

    Pythonのreモジュールを使えば、文字列のパターンマッチや抽出、置換が簡単に行えます。基本関数とパターンの書き方を覚えれば、多くの文字列処理を効率化できます。ぜひ実際にコードを書いて試してみてください。