正規表現のグルーピングで文字を抜き出す方法について
正規表現におけるグルーピングは、括弧を用いて特定の部分をグループ化する機能です。グループ化を使うことで、マッチした文字列の一部を抽出したり、後で利用したりすることができます。本ページでは、正規表現のグルーピングの仕組みと具体例について詳しく解説します。
正規表現のグルーピングの基本
正規表現では、括弧 ()
を使ってグルーピングを行います。グループ化することで、正規表現の中の特定の部分に名前を付けたり、抽出したりすることができます。
例:「(abc)
」というパターンは、「abc」という文字列を1つのグループとして認識します。
Pythonのコード例:
import re
pattern = r'(abc)'
text = 'abcde'
match = re.search(pattern, text)
if match:
print(match.group(1)) # 結果: abc
グルーピングを使った文字列の抽出
グループ化は、文字列の特定部分を抽出する際に非常に有用です。group()
メソッドを使うことで、グループに対応する部分を簡単に取り出せます。
例:日付形式の文字列から年、月、日を抽出する。
import re
pattern = r'(\d{4})-(\d{2})-(\d{2})'
text = '2023-12-25'
match = re.search(pattern, text)
if match:
print('年:', match.group(1)) # 結果: 2023
print('月:', match.group(2)) # 結果: 12
print('日:', match.group(3)) # 結果: 25
ネストしたグループの利用
正規表現では、グループを入れ子(ネスト)にすることが可能です。これにより、複雑な構造の文字列から詳細な情報を抽出できます。
例:ファイル名と拡張子を分離し、それぞれの部分をさらに分解する。
import re
pattern = r'((\w+)\.(\w+))'
text = 'example.txt'
match = re.search(pattern, text)
if match:
print('全体:', match.group(1)) # 結果: example.txt
print('ファイル名:', match.group(2)) # 結果: example
print('拡張子:', match.group(3)) # 結果: txt
名前付きグループの活用
Pythonの正規表現では、名前付きグループを使うことで、抽出したデータにラベルを付けることができます。名前付きグループは、(?P<name>...)
の形式で定義します。
例:名前と年齢を含む文字列からそれぞれの情報を抽出する。
import re
pattern = r'名前:(?P<name>\\w+), 年齢:(?P<age>\\d+)'
text = '名前:山田, 年齢:30'
match = re.search(pattern, text)
if match:
print('名前:', match.group('name')) # 結果: 山田
print('年齢:', match.group('age')) # 結果: 30
非捕捉グループの使い方
特定の部分をグループ化するが、抽出対象には含めたくない場合は非捕捉グループを使用します。非捕捉グループは、(?:...)
の形式で定義します。
例:「http://」や「https://」を無視してドメイン名を抽出する。
import re
pattern = r'(?:https?://)(\\w+\\.\\w+)'
text = 'https://example.com'
match = re.search(pattern, text)
if match:
print('ドメイン名:', match.group(1)) # 結果: example.com
さまざまな実例
以下に、さまざまな実例を示します。
例1:電話番号の抽出
import re
pattern = r'(\\d{3})-(\\d{3})-(\\d{4})'
text = '電話番号: 123-456-7890'
match = re.search(pattern, text)
if match:
print('市外局番:', match.group(1)) # 結果: 123
print('市内局番:', match.group(2)) # 結果: 456
print('加入者番号:', match.group(3)) # 結果: 7890
例2:メールアドレスの抽出
import re
pattern = r'(\\w+)@(\\w+\\.\\w+)'
text = 'メールアドレス: user@example.com'
match = re.search(pattern, text)
if match:
print('ユーザー名:', match.group(1)) # 結果: user
print('ドメイン名:', match.group(2)) # 結果: example.com
例3:HTMLタグの解析
import re
pattern = r'<\\w+>(.*?)</\\w+>'
text = '<p>Hello, World!</p>'
match = re.search(pattern, text)
if match:
print('タグ内の内容:', match.group(1)) # 結果: Hello, World!
これらの例を基に、自分の用途に合わせた正規表現を構築してください。