2009/04/06

Softimage : Sukio Sukio Sukio Python - IX

さて、9回目です。
ちょっと難しい問題に取り組んでいきます。

それでは、正規表現2回目。
defを用いた置換を紹介します。

app = Application;log = app.LogMessage
import re
def repl(m):
  dictRepl = {
    "Model":"A",
    "Model1":"B",
    "Model2":"C",
    "sphere":"maru"
  }
  try:
    return dictRepl[m.group()]
  except:
    return m.group()

for oObj in app.Selection:
  s = "%s -> %s"%( oObj.FullName,re.sub("\w+",repl,oObj.FullName) )
  log(s)

こんな感じの時に実行しています。



このコードは、辞書を使ったパターン置換です。

dictRepl = {
 "Model":"A",
 "Model1":"B",
 "Model2":"C",
 "sphere":"maru"
}

この辞書の部分で、

Model  → A
Model1 → B
Model2 → C
sphere → maru

という置換の定義をする事にしています。
法則というか決まりごとですね。

そして、置換するメソッドとしてsubを使用しています。
re.sub("\w+",repl,oObj.FullName)

第1引数は、拾うパターン。
第2引数は、置換する文字列。またはファンクション。
第3引数は、置換する対象です。

第1引数の \w+
これは、[A-Za-z0-9_]と同じになります。
A~Z、a~z、0~9と_にヒットします。
つまり、XSIの場合"."ドットまで、ひとくくりです。

第2引数は repl
通常は文字列ですが、defを使用出来ます。
上記は、replファンクションが入ります。
このファンクションには、引数として、マッチオブジェクトが入る事になっています。
1でヒットしたマッチオブジェクトです。

return dictRepl[m.group()]

そして、上記replのmに引数が渡され、辞書の値を返します。

例えばこのようにキーを入力すると、値を取ることが出来ます。
dictRepl["Model"] -> "A"

Model なら A が返ってきます。

それと、新たにtry except文を入れてみました。
これは、エラーを吐いても例外に飛ぶことが出来る文です。
try内で、エラーが発生したら、except(例外)に飛びます。
マッチオブジェクトが、Model3というものにヒットした場合、無い辞書のキーを取ってしまうとエラーになります。

dictRepl["Model3"]

これは、エラーですので、回避して何も変換しないという

m.group()

を返すことにしています。

今回は、あまり利用価値が無いものかもですが、一応メモ的な感じです。
応用としては、ターゲットの指定のときに役に立つかなぁとも思ってます。
コンストとか、Definition指定するの面倒ですものね。

とはいえ、正規表現はこの位で終わりますね。
そういえば、JScriptでも同じようなことが出来ますから、別にPythonでなくてもいいんですけどね。
連想配列で検索です。
VBは知りません。

ではでは。

Perforce: 複数のワークスペースを更新するバッチ

batを叩けば全部更新。 @echo off set P4PORT=x.x.x.x:xxxx set P4USER=user set P4PASSWD=password echo %P4PORT% echo %P4USER% echo %P4PASSWD% echo %P4PAS...