PerlからPythonに浮気中の片目猫です。
Google App Engineを利用してやれないかと思って勉強中です。
Pythonはオブジェクト指向のスクリプト言語。
Perlと比べて読みやすいソースコードが書けるらしいです。
たしかに、Perlは記号に意味を持たせすぎて初めて読んだ時は
わけがわからなかったからな。。。
で、Pythonを触ってみた感想ですが、なかなか面白い。
コマンドラインインタプリタも言語としてサポートしていて、
オンラインヘルプもLinuxのmanコマンド的に参照できていい感じです。
クラスも簡単に作れるし、関数オブジェクトも簡単に使えるし。
インデントが強制されていて、同一インデントでネストの
深さを表わすのは面白いですね。
でも、Webに公開されているサンプルソースを試そうと思ったら
インデントが崩れてて全然キチンと動いてくれなくて困ったり。
あと、いかにリスト(シーケンス)を作るかが鍵みたなところがあります。
Python独自のリストの内包表記やジェネレータが威力を発揮します。
このへんPerlとは文化の違いを感じますね。
さて、タイトルの正規表現なのですが、困ったことにPythonは正規表現を
言語的にサポートしていません。
もちろん標準モジュールとしてサポートされてはいますが、
これがPerlに慣れている人間からするとちょっと使いづらい。
試行錯誤してできるだけシンプルにした結果が下です。
例題:数字と英字が連続していた場合、境界にスペースを入れなさい。
たとえば、文字列”12345aiueo”を”12345 aiueo”に置換する。
perl なら、
$str = "12345aiueo"
$str =~ s/([0-9])([a-z])/$1 $2/gi
これが、pythonで同じことをやろうとすると、
import re
str = "12345aiueo"
str = re.sub("([0-9])([a-zA-Z])",lambda x:x.group(1) + " " + x.group(2), str)
となります。
importを除いた処理のための行数は同じですが、明らかにpythonの方が長いです。
その分、わかりやすいと言えば分りやすい...かなぁ?
大きな問題は、置換sub()の置換文字列にグループにマッチした文字が使えないことです。
パターンには使えるんですけどね。
"<(.*)>(.*)</¥1>"
こんな感じでHTMLタグのパースとかに使えそう。
で、これに対応しようとすると、パターンを指定する場所に関数を指定
してあげる必要があります。
関数には、引数にマッチオブジェクトが渡されますので、
引数.group(グループ番号)でマッチした文字を引っ張り出せます。
ちなみに、lambdaは一時的に使い捨ての無名関数を定義できます。
Lisp起源の機能らしいですが、便利なのかな。
関数は重複コードをまとめてなんぼなものと思っているので、
実際使ってみるまで全く利用シーンを思いつかなかった。
今回使用したのはここに関数を書かなくてはならなかったからです。
Perlは関数でなくても全然処理できてるわけで。
正直微妙です。