Address
304 North Cardinal St.
Dorchester Center, MA 02124

Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM

正規表現の量化子「?」「*(アスタリスク)」「+」の解説

正規表現における量化子「?」「*」「+」の基本的な考え方について

今回はPythonのプログラミングそのものに関係する話ではないですが、文字(列)の検索機能のいわゆる正規表現に関する解説です。

プログラミングには正規表現を組み合わせていろいろな処理をさせることができます(メールアドレスによるメールの整理とか)が、正規表現そのものがかなり奥が深く、独特の構文を持つためなかなか難しいです。

そんな正規表現について、今回は量化子(量化演算子・量指定子)と呼ばれて特に使用頻度が高い「?」、「*」(アスタリスク)、そして「+」についてちょっとした考え方の基本を解説します。

正規表現の量化子(量化演算子)とは?

まず正規表現における量化子(量化演算子)とは、Wikipediaでは次のような説明が書かれています。

文字やグループの後ろの量化子は、直前の表現が何回現れることが許されるかを指定する。非常によく使われる量化子は 「?」 と 「*」 と 「+」 である。

はい、何を言ってるのかよくわかりませんね。以下、「?」「*」「+」の3つについて順番に見ていきましょう。

正規表現の量化子「?」について

まず「?」についてですが、同じくWikipediaの説明はこうなっています。

疑問符は直前の表現が0個か1個あることを示す。例えば、「colou?r」 は 「color」 と 「colour」 にマッチする。

これについては次のように整理しましょう。

①:?より前の文字列全体colou
②:?の「直前」の文字列u
③:① – ②colo

「colou?r」という文字列がある。

量化子「?」の前の文字列「colou」を取り出す。

量化子「?」の直前の文字「u」を取り出す。

「u」より前の文字列「colo」を取り出す。

という感じで、量化子「?」より前の文字列を、

  • 量化子直前の文字「u」
  • それ以外の「colo」

の2つに分けるわけです。

そして、これら「u」と「colo」という情報の組み合わせを考えます。

ただし、注意しなければならないのは次の2点です。

  • 「colo」と「u」の順番は変更してはいけない
  • 「colo」をアルファベットで分解してもいけない。「colo」はあくまで1つの塊として扱う

したがって、

  • ucolo
  • coulo
  • locou
  • olcou
  • oluoc

などは全部ダメです。

ここで再び上述Wikipediaの記述を思い出しましょう。

疑問符は直前の表現が0個か1個あることを示す。例えば、「colou?r」 は 「color」 と 「colour」 にマッチする。

ということでした。

結局のところ、「colo」という文字列の後に、「u」をゼロ個つけるか、1個つけるかだけの話となります。したがって、

  • uがゼロ個→colo
  • uが1個→colou

結局この2通りのパターンしかありません。正規表現の量化子「+」は、「colo」または「colou」のどちらかにマッチする文字列(表現)を探すという機能となります。

正規表現の量化子「*」(アスタリスク)について

さて上述「+」についての説明さえ理解できていれば、アスタリスク「+」の量化子についても理解しやすくなります。次のWikipediaの説明を見てください。

アスタリスクは直前の表現が0個以上あることを示す。例えば、「go*gle」 は 「ggle」「gogle」「google」 などにマッチする。

ここで、アスタリスクの「直前の表現」とはアルファベット「o」のことです。

そして、上述「colou」についての注意事項だった、

  • 「colo」と「u」の順番は変更してはいけない
  • 「colo」をアルファベットで分解してもいけない。「colo」はあくまで1つの塊として扱う

という2点を踏まえ、「go*gle」について考えると、

  • 「g」と「o」の順番は変更してはいけない
  • 「g」をアルファベットで分解してもいけない。「g」はあくまで1つの塊として扱う

結局のところ「go*gle」については、たとえば、

「o」がゼロ個 「o」が1個 「o」が2個 「o」が5個
gglegoglegooglegooooogle

このようになります。

量化子「*」は、こういった文字列にマッチする文字列(表現)を探して示す機能を持つわけです。

正規表現の量化子「+」について

では最後の「+」について見ていきましょう。ここまでの解説は「+」量化子についても同じです。Wikipediaでは次のようになっています。

プラス符号は直前の表現が1個以上あることを示す。例えば、「go+gle」 は 「gogle」 や 「google」 などにマッチするが、「ggle」 にはマッチしない。

量化子「*」との違いは、「o」がゼロ個の場合があるかないかですね。

再び、上述の量化子「*」の場合の具体例を見てみましょう。

「o」がゼロ個 「o」が1個 「o」が2個 「o」が5個
gglegoglegooglegooooogle

このような具体例が考えられました。しかし、量化子「+」は「1個以上」です。

したがって上表のうち、「o」がゼロ個の場合の「ggle」は除外されます。

以上で、正規表現の量化子(量化演算子)でよく使われる「?」「*」「+」の3つについて基本的な考え方を説明しましたが、イメージはつかめたでしょうか。

愛を分かち合いましょう