読者です 読者をやめる 読者になる 読者になる

regexp

Erlang Python

 Erlangを使って、どっかでみたことのある正規表現を試してみるテスト。別に難しいことをやっているわけではないのですが、Erlangのregexpには過度に期待せず、別のアプローチをとった方がよさそうです。

> regexp:match("admin/", "^admin/$").      
{match,1,6}
> regexp:first_match("admin/", "^admin/$").
{match,1,6}
> regexp:match("admin/sites/", "^admin/$").
nomatch
> regexp:first_match("admin/sites/", "^admin/$").
nomatch


 Pythonでの次の処理をやりたかったのですが、無理。

>>> re.match(r"wiki/(?P<page_name>\w+)/", "wiki/FrontPage/").groupdict()
{'page_name': 'FrontPage'}


 こちらがErlang

regexp:matches("wiki/FronPage", "wiki/([a-zA-Z_]+)").
{match,[{1,13}]}


 正規表現を使って構文解析もどきをしたいのですが、Erlangregex:splitでは、セパレータを取得できないっぽい。

>>> re.split(r"({{|}}|{%|%})", "{% if spam %}{{ egg }}{% endif %}")
['', '{%', ' if spam ', '%}', '', '{{', ' egg ', '}}', '', '{%', ' endif ', '%}', '']


 こちらがErlang

> regexp:split("{% if spam %}{{ egg }}{% endif %}", "({{|}}|{%|%})"). 
{ok,[[]," if spam ",[]," egg ",[]," endif ",[]]}


 regexp:matchesを使って、セパレータにマッチした位置をとればよさそうですが、もっとErlang的なやり方があるでしょうね。でもParserとか書きたくないなぁ。

> regexp:matches("{% if spam %}{{ egg }}{% endif %}", "({{|}}|{%|%})").
{match,[{1,2},{12,2},{14,2},{21,2},{23,2},{32,2}]}