目次
〜貪欲マッチと非貪欲マッチ〜
貪欲マッチ
a=re.compile(r'(Ha){3,5}') #Haを3〜5回繰り返す文字列とマッチする
b=a.search('HaHaHaHaHa')
print(b)
#出力結果は
<re.Match object; span=(0, 10), match='HaHaHaHaHa'> #Ha5つとマッチしています
{3,5} は「3~5回繰り返す」という意味です。
正規表現はデフォルトでは できるだけ長くマッチしようとする(貪欲マッチ) ため、HaHaHaHaHa 全体(Haが5個)にマッチします。
非貪欲マッチ
a=re.compile(r'(Ha){3,5}?')
b=a.search('HaHaHaHaHa')
print(b)
出力結果は
<re.Match object; span=(0, 6), match='HaHaHa'> #Ha3つとだけマッチ
? を付けて {3,5}? とすると、できるだけ短くマッチする(非貪欲マッチ) ようになります。
そのため、条件を満たす最小回数である HaHaHa(Haが3個)だけにマッチします。
まとめ
| 正規表現 | マッチする文字列 |
|---|---|
(Ha){3,5} | HaHaHaHaHa(最大5個) |
(Ha){3,5}? | HaHaHa(最小3個) |
? を付けることで、条件を満たす範囲の中で最も短い文字列にマッチする(非貪欲マッチになる)。
感想
正直どういった場面でこれを使うことになるのか、全く想像つかない。

コメント