Python: 正規表現の最長マッチと最短マッチ
Pythonの正規表現における 「最長マッチ」と「最短マッチ」の違いや、 それぞれの指定方法を紹介します。
最長マッチ
正規表現の繰り返しを表す特殊文字として「*」「+」「?」があります。 これらで記述したパターンにマッチする範囲は、一致する中で最も長い範囲です。
例えば次のようなHTMLを正規表現で検索してみます。 (div 要素の中に2つの b 要素があります)
import re # パターン p = "<b>.*</b>" # 検索対象文字列 s = "<div><b>hello</b><b>world</b></div>" m = re.search(p, s) if m: print(m.group())
パターンを「<b>.*</b>」とした場合の実行結果は次の通りです。
実行結果
<b>hello</b><b>world</b>
実行結果をみると、「<b>hello</b>」ではなく、 「<b>hello</b><b>world</b>」となっています。 最も長い範囲が取得されていて、これを「最長マッチ」といいます。
最短マッチ
「最長マッチ」に対して最も短い範囲で取得する場合を「最短マッチ」といいます。 上のコードだと「<b>hello</b>」が最短マッチとなります。
「最短マッチ」で取得する場合は、繰り返しを表す特殊文字「*」「+」「?」のあとに
「?」を付けます。
つまり「*?」「+?」「??」と記述します。
import re # パターン p = "<b>.*?</b>" # 検索対象文字列 s = "<div><b>hello</b><b>world</b></div>" m = re.search(p, s) if m: print(m.group())
今回はパターンを「<b>.*?</b>」としています。 実行結果は次の通りです。
実行結果
<b>hello</b>
一致する範囲の中で、最も短い範囲の bタグが取得できています。
「最短マッチ」で取得したい場合は、
「*?」「+?」「??」のように、後ろに「?」を付けてください。