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

Python正規表現における疑問符(?)の意味と使い方を徹底解説

Pythonの正規表現において、疑問符リテラル「?」は複数の異なる用途で使われる重要なメタ文字です。この記事では、「?」がどのような場面でどのように機能するのかを、公式ドキュメントに基づいてわかりやすく解説します。

特殊文字としての「?」:直前のパターンを0回または1回マッチ

特殊文字としての「?」は、直前の正規表現(RE)が0回または1回出現することにマッチさせます。つまり、その要素が「あってもなくてもよい」という意味になります。

たとえば、パターン ab? は「a」単体にも「ab」にもマッチします。「b」が存在してもしなくてもよい、という条件になるわけです。

量指定子を非貪欲(最短一致)にする

*?, +?, ??

*」「+」「?」といった量指定子は、デフォルトではすべて貪欲(greedy)に動作します。つまり、可能な限り長いテキストにマッチしようとします。

しかし、この動作が望ましくない場合もあります。たとえば、正規表現 <.*> を文字列 '<a> b <c>' に対して適用すると、意図に反して文字列全体がマッチしてしまい、「<a>」だけを取り出すことができません。

そこで、量指定子の直後に「?」を付けることで、マッチの動作を非貪欲(non-greedy/最小一致)に変更できます。この場合、できるだけ少ない文字数でマッチが成立します。先ほどの例で <.*?> を使えば、マッチ結果は「<a>」のみになります。

その他の用途:グループ化や先読みとの組み合わせ

Pythonの正規表現では、「?」は上記以外にもさまざまな構文で利用されます。

  • (?:...):キャプチャしないグループを作成します。後方参照が不要な場合に便利です。
  • (?=...):肯定先読み。指定したパターンが続く位置にマッチします。
  • (?!...):否定先読み。指定したパターンが続かない位置にマッチします。

このように、疑問符「?」一つをとっても、Pythonの正規表現では多彩な役割を持っています。用途に応じて正しく使い分けることで、より柔軟かつ精密なパターンマッチングを実現できます。

  1. Pythonの正規表現で単語以外の文字をマッチさせる方法

    正規表現を使って文字列から「単語以外の文字」を取り出したい場合、Pythonのreモジュールに用意されている特殊シーケンス \W を使うのが最も簡単です。\W は、英字・数字・アンダースコア([^a-zA-Z0-9_])以外のすべての文字に一致します。以下のコードでは、指定した文字列から単語以外の文字をすべて抽出し、そのリストを出力しています。コード例import re s = ab5z8d*$&Y@ regx = re.compile(r\W) result = regx.findall(s) print(result)ポイントとして、パターン文字列の先頭に r を付けて raw 文字列に

  2. 【Python】正規表現を使って文字列内の単語をマッチ・抽出する方法

    次のコードは、指定された文字列の中から「meeting」という単語を抽出します。ここでは肯定の先読み(look-ahead)と肯定の後読み(look-behind)アサーションを使用しています。これにより、単語を囲む文字の存在を条件として考慮しつつ、その文字自体はマッチ結果に含めないようにできます。コード例import re s = https://www.google.com/meeting_agenda_minutes.html result = re.findall(r(?<=[\W_])meeting(?=[\W_]), s) print(result)出力[meeting]パ