2014年9月11日木曜日

Rubyistが歩んでみる蛇の道はPython その4

Dive into Python 3のchapter 5をさらりと読んでみた。

Rubyを含む他のLLと同様、Pythonでも正規表現は使える。が、意外なことに、reモジュールを明示的にimportしないと使えない。下の例はimport reを端折ると動かない。

>>> import re
>>> str = 'abcdefg'
>>> re.sub(r'c.e', 'XYZ', str)
'abXYZfg'
>>> m = re.search(r'.{4}$', str)
>>> m.group(0)
'defg'
同じことをRubyでやろうとするとこんな感じ。
irb> str = 'abcdefg'
irb> str.sub(/c.e/, 'XYZ')
=> "abXYZfg"
irb> m = /.{4}$/.match(str)
irb> m[0]
=> "defg"

ちなみにPythonのr'...'は、正規表現リテラルではなく単なる文字列リテラル。regular expressionではなくraw stringのr。rを付けるとRubyで言うところの'...'文字列のように、\等が特別扱いされなくなる。

さて、実質定数な正規表現でも、内部的には使う度に文字列から正規表現に変換しなければならないかと言うと、さすがにそんなことはなく、re.compile()を使えば正規表現オブジェクトを作成できる。また、その正規表現オブジェクトは、subだのsearchだの、reモジュールと同名の関数を持っている。もちろん、引数に正規表現文字列は取らないけど。

正規表現のオプションは、正規表現文字列を受け取るreモジュールの関数に引数flagsとして渡してやる。このflagsはデフォルト値0が設定されているので省略可能。Rubyで言うところの

r = /ab c/ix
が、Pythonでは
r = re.compile(r'ab c', re.I | re.X)
となる。ちとクドいね。あと、Rubyの正規表現にフリーフォーマットモード(x)があることを今更知った。

0 件のコメント:

コメントを投稿