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タグが取得できています。
「最短マッチ」で取得したい場合は、 「*?」「+?」「??」のように、後ろに「?」を付けてください。