Python正規表現の特殊文字「.」「?」「*」の違いをわかりやすく解説
はじめに
Pythonの正規表現(reモジュール)では、特定の意味を持つ特殊文字がいくつか用意されています。その中でも頻繁に使われるのが「.(ドット)」「?(クエスチョンマーク)」「*(アスタリスク)」の3つです。それぞれ役割が異なるため、違いをしっかり理解しておくことが重要です。
特殊文字「.」(ドット)
ドットは「任意の1文字」にマッチします。
デフォルトのモードでは、改行文字以外のあらゆる1文字と一致します。例えば a.c というパターンは、「abc」「a1c」「a c」などにマッチします。
ただし、re.DOTALL フラグを指定した場合は、改行文字も含めたすべての文字にマッチするようになります。
import re
# デフォルト:改行にはマッチしない
print(re.match('a.c', 'abc')) # マッチする
# DOTALLフラグ:改行にもマッチする
print(re.match('a.c', 'a\nc', re.DOTALL)) # マッチする特殊文字「?」(クエスチョンマーク)
直前の要素が「0回または1回」出現することを表します。
つまり、直前の文字やグループがあってもなくてもマッチします。例えば ab? は「a」または「ab」のどちらにもマッチします。
import re
print(re.fullmatch('ab?', 'a')) # マッチする
print(re.fullmatch('ab?', 'ab')) # マッチする
print(re.fullmatch('ab?', 'abb')) # マッチしない特殊文字「*」(アスタリスク)
直前の要素が「0回以上」繰り返されることを表します。
できるだけ多くの繰り返しにマッチしようとする(貪欲なマッチ)点が特徴です。例えば ab* は「a」「ab」「abb」「abbbb」など、「a」の後に「b」がいくつ続いていてもマッチします。
import re
print(re.fullmatch('ab*', 'a')) # マッチする
print(re.fullmatch('ab*', 'ab')) # マッチする
print(re.fullmatch('ab*', 'abbb')) # マッチする
print(re.fullmatch('ab*', 'ba')) # マッチしない「?」と「*」の違いまとめ
| 特殊文字 | 意味 | マッチ例(ab? / ab*) |
|---|---|---|
. | 任意の1文字(改行を除く) | — |
? | 直前の要素が0回または1回 | 「a」「ab」 |
* | 直前の要素が0回以上 | 「a」「ab」「abbb…」 |
このように、「?」は最大1回までしか繰り返しを許さないのに対し、「*」は無制限に繰り返しを許す点が大きな違いです。用途に応じて使い分けることで、柔軟で正確なパターンマッチングを実現できます。
-
Pythonのtkinterとtkinter.ttkウィジェットの違いとは?スタイリング方法を解説
tkinter.ttkは、tkinterウィジェットのスタイル(見た目)を設定するためのモジュールです。HTML要素にCSSでデザインを適用するように、tkinter.ttkを使うことでtkinterウィジェットの外観を自由にカスタマイズできます。 tkinterウィジェットとtkinter.ttkの主な違い tkinterウィジェットは、ボタン・ラベル・テキスト・スクロールバーなど、基本的なGUI部品を追加するために使用します。一方、tkinter.ttkは標準のtkinterよりも多くの種類のウィジェットをサポートしています。 tkinter.ttkではPlaceやPack()、Grid
-
Pythonの「except Exception as e」と「except Exception, e」の違いは何ですか?
except文における「,(カンマ)」と「as」の違い Pythonのexcept文で発生した例外を変数に代入する際には、「カンマ(,)」を使う書き方と「as」を使う書き方の2通りがあります。結論から言うと、両者は機能的にはほぼ同じですが、どちらが使えるかはPythonのバージョンによって異なります。 バージョンごとの使い分け Python 2.5以前:「as」構文がサポートされていないため、カンマを使う必要があります。 Python 2.6〜2.7:カンマと「as」のどちらも使用できます。 Python 3.x以降:例外を変数に代入するには「as」が必須となり、カンマ形式は構文エラーにな