[Python] 正規表現で複数パターンで同時に抽出する方法
Pythonで正規表現を使用して複数のパターンを同時に抽出するには、re
モジュールのfindall
やfinditer関数
を使用し、パターンを|
(OR演算子)で結合します。
例えば、re.findall(r'pattern1|pattern2', text)
のように記述することで、pattern1
またはpattern2
に一致する部分を抽出できます。
複数のパターンをグループ化してキャプチャする場合は、括弧を使用してグループを定義します。
- 正規表現の基本的な使い方
- 複数パターンの抽出方法
- グループ化の活用法
- 応用例としての実践的なコード
- 抽出結果の整理方法
複数パターンを同時に抽出する方法
OR演算子|を使ったパターンの結合
Pythonの正規表現では、OR演算子|
を使用して複数のパターンを結合することができます。
これにより、いずれかのパターンにマッチする文字列を同時に抽出することが可能です。
例えば、”apple”または”orange”という単語を抽出したい場合、次のように記述します。
import re
text = "I like apple and orange."
pattern = r'apple|orange'
matches = re.findall(pattern, text)
print(matches)
['apple', 'orange']
グループ化とキャプチャの基本
正規表現では、グループ化を行うことで、特定の部分をキャプチャし、後で参照することができます。
グループ化は、丸括弧()
を使って行います。
例えば、”cat”または”dog”の後に続く数字を抽出する場合、次のように記述します。
import re
text = "I have a cat123 and a dog456."
pattern = r'(cat|dog)(\d+)'
matches = re.findall(pattern, text)
print(matches)
[('cat', '123'), ('dog', '456')]
re.findallで複数パターンを抽出する
re.findall関数
を使用すると、指定したパターンにマッチするすべての部分をリストとして取得できます。
複数のパターンを同時に抽出する場合、OR演算子を使ったパターンを指定します。
以下の例では、”cat”または”dog”を抽出しています。
import re
text = "I have a cat and a dog."
pattern = r'cat|dog'
matches = re.findall(pattern, text)
print(matches)
['cat', 'dog']
re.finditerで複数パターンを抽出する
re.finditer関数
は、マッチオブジェクトのイテレータを返します。
これにより、マッチした部分の詳細情報を取得することができます。
以下の例では、”cat”または”dog”を抽出し、それぞれのマッチの位置を表示します。
import re
text = "I have a cat and a dog."
pattern = r'cat|dog'
matches = re.finditer(pattern, text)
for match in matches:
print(f'Found "{match.group()}" at position {match.start()}')
Found "cat" at position 9
Found "dog" at position 19
複数パターンの優先順位とマッチングの順序
正規表現では、複数のパターンがある場合、最初にマッチしたものが優先されます。
これにより、特定のパターンを優先的に抽出したい場合は、パターンの順序を考慮する必要があります。
例えば、”cat”と”catfish”の両方を含むテキストから”catfish”を優先的に抽出したい場合、次のように記述します。
import re
text = "I saw a cat and a catfish."
pattern = r'catfish|cat'
matches = re.findall(pattern, text)
print(matches)
['catfish', 'cat']
このように、正規表現のパターンの順序を工夫することで、抽出結果を制御することができます。
実際のコード例
単純な文字列パターンの抽出
単純な文字列パターンを抽出する場合、正規表現を使って特定の単語を見つけることができます。
以下の例では、”apple”と”banana”という単語を抽出しています。
import re
text = "I like apple and banana."
pattern = r'apple|banana'
matches = re.findall(pattern, text)
print(matches)
['apple', 'banana']
数字とアルファベットの同時抽出
数字とアルファベットを同時に抽出する場合、正規表現を使ってそれぞれのパターンを組み合わせることができます。
以下の例では、英字と数字を同時に抽出しています。
import re
text = "abc123 xyz456"
pattern = r'[a-zA-Z]+|\d+'
matches = re.findall(pattern, text)
print(matches)
['abc', '123', 'xyz', '456']
特定の単語と日付フォーマットの同時抽出
特定の単語と日付フォーマットを同時に抽出する場合、正規表現を使って複数のパターンを組み合わせることができます。
以下の例では、”event”という単語と”YYYY-MM-DD”形式の日付を抽出しています。
import re
text = "The event is on 2023-10-01 and 2023-11-15."
pattern = r'event|\d{4}-\d{2}-\d{2}'
matches = re.findall(pattern, text)
print(matches)
['event', '2023-10-01', '2023-11-15']
グループ化を使った複数パターンの抽出
グループ化を使うことで、複数のパターンを同時に抽出し、さらに詳細な情報を得ることができます。
以下の例では、”cat”または”dog”の後に続く数字を抽出しています。
import re
text = "I have a cat123 and a dog456."
pattern = r'(cat|dog)(\d+)'
matches = re.findall(pattern, text)
print(matches)
[('cat', '123'), ('dog', '456')]
このように、グループ化を使うことで、マッチした部分をより詳細に取得することができます。
応用例
複数のメールアドレス形式を同時に抽出する
メールアドレスの形式はさまざまですが、一般的な形式を正規表現で定義し、複数のメールアドレスを同時に抽出することができます。
以下の例では、一般的なメールアドレス形式を抽出しています。
import re
text = "Contact us at info@example.com or support@domain.co.jp."
pattern = r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
matches = re.findall(pattern, text)
print(matches)
['info@example.com', 'support@domain.co.jp']
複数のURL形式を同時に抽出する
URLもさまざまな形式がありますが、一般的なURL形式を正規表現で定義し、複数のURLを同時に抽出することができます。
以下の例では、HTTPおよびHTTPSのURLを抽出しています。
import re
text = "Visit us at http://example.com or https://secure-site.org."
pattern = r'https?://[a-zA-Z0-9.-]+(?:\.[a-zA-Z]{2,})+'
matches = re.findall(pattern, text)
print(matches)
['http://example.com', 'https://secure-site.org']
複数の電話番号形式を同時に抽出する
電話番号の形式も国や地域によって異なりますが、一般的な形式を正規表現で定義し、複数の電話番号を同時に抽出することができます。
以下の例では、国内の電話番号形式を抽出しています。
import re
text = "Call us at 03-1234-5678 or 080-9876-5432."
pattern = r'\d{2,4}-\d{2,4}-\d{4}'
matches = re.findall(pattern, text)
print(matches)
['03-1234-5678', '080-9876-5432']
複数のファイル拡張子を同時に抽出する
ファイル名の拡張子を抽出する場合、特定の拡張子を正規表現で定義し、複数のファイル名から拡張子を同時に抽出することができます。
以下の例では、”.jpg”、”.png”、”.gif”の拡張子を持つファイル名を抽出しています。
import re
text = "Images: photo.jpg, diagram.png, animation.gif."
pattern = r'\w+\.(jpg|png|gif)'
matches = re.findall(pattern, text)
print(matches)
['jpg', 'png', 'gif']
このように、正規表現を活用することで、さまざまな形式のデータを効率的に抽出することができます。
よくある質問
まとめ
この記事では、Pythonの正規表現を使用して複数のパターンを同時に抽出する方法について詳しく解説しました。
具体的には、OR演算子を使ったパターンの結合や、グループ化を利用した抽出方法、さらに実際のコード例を通じて、メールアドレスやURL、電話番号などのデータを効率的に取得する手法を紹介しました。
これらのテクニックを活用することで、データ処理やテキスト解析の作業がよりスムーズに行えるようになるでしょう。
正規表現を使ったデータ抽出に挑戦し、実際のプロジェクトに応用してみてください。