貪欲マッチと非貪欲マッチ

Pythonで学ぶ正規表現

Maria Eugenia Inzaugarat

Data Scientist

貪欲マッチと非貪欲マッチ

  • マッチ方法は2種類:

    • 貪欲(greedy)
    • 非貪欲(lazy)
  • 標準の量指定子は既定で貪欲: *, +, ?, {num, num}

Pythonで学ぶ正規表現

貪欲マッチ

  • 貪欲: できるだけ多くの文字にマッチ

  • 最長一致を返す

import re
re.match(r"\d+", "12345bcada")
<re.Match object; span=(0, 5), match='12345'>

Pythonで学ぶ正規表現

貪欲マッチ

  • マッチし過ぎたらバックトラック

  • 1文字ずつ諦める

import re
re.match(r".*hello", "xhelloxxxxxx")
<re.Match object; span=(0, 6), match='xhello'>

Pythonで学ぶ正規表現

非貪欲マッチ

  • 非貪欲: 必要最小限だけマッチ
  • 最短一致を返す
  • 貪欲な量指定子に ? を付ける
import re
re.match(r"\d+?", "12345bcada")
<re.Match object; span=(0, 1), match='1'>

Pythonで学ぶ正規表現

非貪欲マッチ

  • マッチが少なすぎるとバックトラック

  • 1文字ずつ拡張

import re
re.match(r".*?hello", "xhelloxxxxxx")
<re.Match object; span=(0, 6), match='xhello'>

Pythonで学ぶ正規表現

練習しましょう!

Pythonで学ぶ正規表現

Preparing Video For Download...