Python
 Computer >> コンピューター >  >> プログラミング >> Python

Python正規表現の選択(オルタネーション)の仕組みと使い方を徹底解説

選択(オルタネーション)とは何か

実際の開発では、2つ以上の候補のうち「いずれか1つ」にマッチする正規表現を使う場面がよくあります。また、複数の表現をひとまとめにして量指定子を適用したいケースもあります。こうした目的は、丸括弧 () によるグループ化と、選択を意味する縦棒 | を組み合わせることで実現できます。

縦棒(|)を使った選択の基本

選択は、複数の異なるパターンのどれかにマッチさせたいときに非常に便利です。たとえば、次の正規表現は「airways」「airplane」「bomber」のいずれかを含むテキストにマッチします。

airways|airplane|bomber

同じことは、共通部分をくくり出した次の書き方でも実現できます。

air(ways|plane)|bomber

グループ化とキャプチャの挙動

正規表現を (airways|airplane|bomber) とした場合、3つの候補のいずれかにマッチし、その全体が1つのキャプチャとして記録されます。

一方、(air(ways|plane)|bomber) のように入れ子にすると、マッチした場所によってキャプチャの数が変わります。

  • 最初の式がマッチした場合:キャプチャは2つ(1つ目は「airways」または「airplane」、2つ目は「ways」または「plane」)
  • 2番目の式がマッチした場合:キャプチャは1つ(「bomber」)

このように不要なキャプチャを避けたい場合は、開き括弧の直後に ?: を付けてキャプチャ機能を無効化します。

(air(?:ways|plane)|bomber)

これにより、マッチ時のキャプチャは1つだけ(「airways」「airplane」「bomber」のいずれか)になります。

コード例

以下のコードは、ここまで説明した内容を実際に確認できるサンプルです。

import re

s = 'airways aircraft airplane bomber'

result = re.findall(r'(airways|airplane|bomber)', s)
print(result)

result2 = re.findall(r'(air(ways|plane)|bomber)', s)
print(result2)

result3 = re.findall(r'(air(?:ways|plane)|bomber)', s)
print(result3)

実行結果

['airways', 'airplane', 'bomber']
[('airways', 'ways'), ('airplane', 'plane'), ('bomber', '')]
['airways', 'airplane', 'bomber']

ポイントのまとめ

  • | は複数の候補のいずれかにマッチさせるための選択演算子です。
  • re.findall() では、パターン内にキャプチャグループがあると、マッチ全体ではなくグループの中身が返されます(2つ目の出力のようにタプルになる点に注意)。
  • (?:...) を使うとグループ化は保ちつつキャプチャを無効化でき、出力をシンプルにできます。
  1. Pythonの正規表現で任意の1文字にマッチさせる方法

    Pythonの正規表現では、特別なメタ文字「.」(ドット)を使用することで、文字列内の任意の1文字にマッチさせることができます。このメタ文字は、改行文字(\n)を除くあらゆる単一の文字と一致します。re.findall() 関数と組み合わせれば、指定した文字列からすべての文字を1つずつ取り出すことが可能です。サンプルコードimport re foo = https://www/twitter/index.php 403 result = re.findall(r., foo) print(result)実行結果上記のコードを実行すると、次のような出力が得られます。文字列内の各文字(英字・記号

  2. Pythonの正規表現における修飾子(フラグ)の使い方と機能一覧

    Python正規表現の修飾子とはPythonのreモジュールでは、正規表現によるパターンマッチングの挙動を制御するために、さまざまな修飾子(フラグ)を指定することができます。これらの修飾子を使うことで、大文字小文字の区別や改行の扱いなど、マッチングの動作を柔軟に変更できます。以下に、主要な修飾子とその機能を一覧形式で紹介します。1. re.I(re.IGNORECASE)大文字と小文字を区別せずにマッチングを行います。英字の大小を無視したい場合に便利です。2. re.L(re.LOCALE)現在のロケール設定に従って単語を解釈します。このフラグは、アルファベット系のグループ(\w および \W