2012/04/20

[メモ] pythonで正規表現やってみました

DigitalFrontier様のblogのこちらの記事「ねえ貴方たち正規表現使ってみなさいよ、捗りましてよ」を参考に正規表現ではかどってみました!




どういう面倒があったかというと、
リファレンスやらインポートやらを経たのちのアニメーションカーブノードを大量に改名する必要にかられまして。
具体的には

_Head_Center_rotateX

みたいな(実際のものとは異なります(笑))のの、

_Head_Center_rotateX

↑赤い部分が要らないと。これが、トランスレートにもローテートにもあって、全身の骨分ありましたので、数百ほど。かける数キャラかける数モーション。…。
ここでのHeadはオブジェクト名なので、文字数もばらばらです。さて。

 そこで、捗りましてよと囁く妖艶な美女(想定)に誘われるがまま、正規表現モジュールをインポートしてやってみました。
出来上がったのは↓こんな感じ。



import re
import maya.cmds as mc

sel = mc.ls(sl = 1)

for node in sel:
    p = re.compile("(_)(.*?)(_)(.*)")
    m = p.match(node)
    mc.rename( node, m.group(4) )



勢いでmaya.cmds使っておりますが… まず最初の2行でインポート。reが正規表現モジュールですね。
4行目で選択オブジェクトを取得。
6行目でループを開始しています。大量の敵を相手にするときの基本兵装。次回くらいのpython記事で取り上げる予定です。
7行目のre.compile("(_)(.*?)(_)(.*)") ここがミソです。
””のあいだに()が4つ書いてありますが、それぞれが文字をグループ分けするのに使われます。

最初の文字が「_」
つぎ何文字か分からないけど、「次の条件が当てはまるまでの」何文字かのかたまり
その何文字かのあとの「_」
残りの文字列

という四グループに分けさせて、該当するものを探させてます。

最初の _Head_Center_rotateX に当てはめると

1グループ目 「_
2グループ目 「Head
3グループ目 「_」(先頭から二度目の)
4グループ目 「Center_rotateX
と分けられます。
最後の行 mc.rename でリネーム。m.group(4)で四グループ目を指定していますので

 _Head_Center_rotateX  Center_rotateX

とリネームされます。 (ちなみに0グループ目を指定すると、「_Head_Center_rotateX」まるごと全部が返ってきます)

正規表現「.*?」についてですが、

. は「数字を含む文字なんでも」
* は「何文字でも」
? で、次の条件が当てはまるまで

と指定しています。4グループ目は「.*」になってますので残り全部です(順番的にも結局残り全部ですが(^^; )。

 この他にもre.compile()の部分を変えて遊んでみてください。
 あともっと素敵な書き方があったら是非ご紹介くださいm(_ _;)m



■参考サイト 

ねえ貴方たち正規表現使ってみなさいよ、捗りましてよ @DFTALK

rename コマンド(Python) @Maya オンラインヘルプ 

正規表現HOWTO @日本pythonユーザ会

0 件のコメント:

コメントを投稿