Python正規表現:グルーピングと量指定子の基本

この記事では、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") はマッチしない

まとめ

正規表現のグルーピングと量指定子を組み合わせることで、単純なテキスト検索から、複雑な構造を持つデータの抽出まで、幅広いタスクに対応できるようになります。丸括弧()でパターンをグループ化し、縦線|で選択肢を与え、?, *, +, {}でその繰り返し回数を制御するのが基本です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次