Python正規表現reモジュールの使い方完全ガイド
Pythonの正規表現reモジュールの基本的な使い方から、パターンマッチ、文字列抽出、置換まで具体例で解説。初心者でも理解できる実践的なガイド。
はじめに
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.IGNORECASEやre.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モジュールを使えば、文字列のパターンマッチや抽出、置換が簡単に行えます。基本関数とパターンの書き方を覚えれば、多くの文字列処理を効率化できます。ぜひ実際にコードを書いて試してみてください。