この記事では、Pythonの正規表現モジュールre
を使い、テキストパターンをより柔軟に、かつ強力に検索するためのグルーピングと量指定子の基本について解説します。
丸括弧 ()
を用いたグルーピング
正規表現の中で丸括弧()
を使うと、パターンの一部をグループとしてまとめることができます。これにより、マッチした部分文字列から、さらに特定の箇所だけを抽出することが可能になります。
import re
# パターン: (3桁の数字)-(8桁の数字)
# \dは任意の数字、{n}はn回の繰り返しを意味します
phone_pattern = re.compile(r'(\d{3})-(\d{8})')
text = "私の連絡先は 090-12345678 です。"
match_object = phone_pattern.search(text)
# グループを使って各部分を取り出す
print(f"マッチ全体 (group 0): {match_object.group(0)}")
print(f"最初のグループ (group 1): {match_object.group(1)}")
print(f"2番目のグループ (group 2): {match_object.group(2)}")
# groups()メソッドはすべてのグループをタプルで返す
all_groups = match_object.groups()
print(f"全グループのタプル: {all_groups}") # 出力: ('090', '12345678')
# 複数代入で変数に直接割り当てることも可能
area_code, main_number = all_groups
print(f"市外局番: {area_code}")
縦線 |
を用いた複数パターンの選択
縦線|
(パイプ)は、**「または(OR)」**を意味し、複数のパターンのいずれかにマッチさせることができます。
# 'apple' または 'orange' にマッチ
fruit_pattern = re.compile(r'apple|orange')
match1 = fruit_pattern.search("I like to eat an apple.")
print(match1.group()) # 出力: apple
match2 = fruit_pattern.search("An orange is also good.")
print(match2.group()) # 出力: orange
丸括弧によるグルーピングと組み合わせることで、単語の一部が異なるパターンにも対応できます。
Python
# fileで始まり、name, path, sizeのいずれかが続くパターン
file_pattern = re.compile(r'file(name|path|size)')
match = file_pattern.search("The filename is document.txt")
print(match.group()) # 出力: filename (マッチ全体)
print(match.group(1)) # 出力: name (グループ部分)
量指定子:パターンの繰り返し
量指定子を使うと、直前のグループが何回繰り返されるかを指定できます。
?
(疑問符)は、直前のグループが0回または1回出現する場合にマッチします。オプションのパターンを表現するのに便利です。
# uが0回または1回出現する'color'または'colour'にマッチ
color_pattern = re.compile(r'colou?r')
print(color_pattern.search("The color is red.").group()) # 出力: color
print(color_pattern.search("The colour is blue.").group()) # 出力: colour
*
(アスタリスク)は、直前のグループが0回以上繰り返される場合にマッチします。
# (ha)が0回以上繰り返されるパターン
laugh_pattern = re.compile(r'ha(ha)*')
print(laugh_pattern.search("He said ha.").group()) # 出力: ha
print(laugh_pattern.search("He said hahaha.").group()) # 出力: hahaha
+
(プラス)は、直前のグループが1回以上繰り返される場合にマッチします。*
と似ていますが、最低1回は出現する必要があります。
# 任意の1桁以上の数字にマッチ
number_pattern = re.compile(r'\d+')
print(number_pattern.search("There are 10 apples.").group()) # 出力: 10
print(number_pattern.search("ID: 12345").group()) # 出力: 12345
{}
(波括弧)は、繰り返しの回数を正確に指定します。
{n}
: ちょうどn回{n,}
: n回以上{,m}
: m回以下{n,m}
: n回からm回の間
# haが3回から5回繰り返されるパターン
ha_pattern = re.compile(r'(ha){3,5}')
print(ha_pattern.search("hahaha").group()) # 出力: hahaha (3回)
print(ha_pattern.search("hahahahaha").group())# 出力: hahahahaha (5回)
# ha_pattern.search("haha") はマッチしない
まとめ
正規表現のグルーピングと量指定子を組み合わせることで、単純なテキスト検索から、複雑な構造を持つデータの抽出まで、幅広いタスクに対応できるようになります。丸括弧()
でパターンをグループ化し、縦線|
で選択肢を与え、?
, *
, +
, {}
でその繰り返し回数を制御するのが基本です。