Wed, March 8, 2006
控えめなマッチ(正規表現)(python,regex)
正規表現は、デフォルトでいわゆる欲張りなマッチになるため、 それが不都合な場合がある。
たとえば、以下のような文字列があった場合...
{link:title|http://foobar/}
- マクロ名=link
- マクロ引数=title|http://foobar/
の二つの部分に文字列を分解したい。 これを、 正規表現で処理するにはどうしたらいいか。
正規表現のテストコード
import java.lang as lang
import java.util.regex as re
rex="\\{(.*?):(.*)\\}"
patt=re.Pattern.compile(rex)
#m=patt.matcher(lang.String("{hoge:hoge2:hoge3}"))
m=patt.matcher(lang.String("{macroname:foo|http://lessisbetter.org/}"))
if m.find():
print m.group(1)
print m.group(2)
ポイントは、 (.?):(.) の部分で、*?と書くことで控えめにマッチするので、 デフォルトの欲張りなマッチのように、http: の”:”までマッチしないで済む。