どういう面倒があったかというと、
リファレンスやらインポートやらを経たのちのアニメーションカーブノードを大量に改名する必要にかられまして。
具体的には
_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) )
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 件のコメント:
コメントを投稿