更具体地说,我想弄清楚如何: name.replace xX with y if x exists, if not then just replace X
我已经在这个论坛上搜索了一个小时,把它变成了两个,我发现的只是如何用另一个替换一个东西,现在这很容易。
/一个
你可以运行:
output = name.replace('xX','y').replace('X','y')
例子:
name = "123xX345X"
output = "123y345y"
听起来像是正则表达式的工作x?X
:
>>> import re
>>> text = " test xX blabla"
>>> re.sub('x?X', 'y', text)
' test y blabla'
>>> text = " test X blabla"
>>> re.sub('x?X', 'y', text)
' test y blabla'
引用有关标记的文档:?
问号字符 ? 匹配一次或零次;您可以将其视为将某些内容标记为可选。例如, home-?brew 匹配 homebrew 或 home-brew。
if 'x' in name:
name = name.replace('xX','y')
else:
name = name.replace('X','y')
从您上面的示例来看,这是一个稍微复杂的问题。您必须确保在根命名空间中进行重命名,否则事情会变得很糟糕。您还冒着在孩子之前重命名父母的风险,这将很难通过调用 ls 来了解孩子。所以:
def replace_with_any_namespace(src, tgt):
cmds.namespace(set=":")
results = {}
xforms = cmds.ls(r=True, tr=True, l=True) # use long paths and recursive to get all namespaces
xforms = [i for i in xforms if src in i] # only work on items with your target pattern
xforms.sort()
xforms.reverse() # sort and reverse means children get renamed before parents
for item in xforms:
path, sep, shortname = item.rpartition("|") # gets only the last name
newname = shortname.replace(src, tgt) # this should be fine even if the namespace is there
results[item] = cmds.ls(cmds.rename ( item, newname), l=True)[0]
# the paths and returns are all long paths so there are no ambiguities
return results
你想用这个把东西移出他们的命名空间吗?这更容易:
cmds.namespace(mv = ("R", ":"), force=True)
它将 R:* 中的所有内容移动到基本命名空间。然而,这可能会导致一些重命名。在调用它之前,您可能希望将重要节点放入一个集合中,以便找到它们。