0

更具体地说,我想弄清楚如何: name.replace xX with y if x exists, if not then just replace X

我已经在这个论坛上搜索了一个小时,把它变成了两个,我发现的只是如何用另一个替换一个东西,现在这很容易。

/一个

4

4 回答 4

4

你可以运行:

output = name.replace('xX','y').replace('X','y')

例子:

name = "123xX345X" 
output = "123y345y"
于 2013-07-29T12:55:56.250 回答
2

听起来像是正则表达式的工作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。

于 2013-07-29T12:56:33.787 回答
1
if 'x' in name:
    name = name.replace('xX','y')
else:
    name = name.replace('X','y')
于 2013-07-29T12:54:46.840 回答
1

从您上面的示例来看,这是一个稍微复杂的问题。您必须确保在根命名空间中进行重命名,否则事情会变得很糟糕。您还冒着在孩子之前重命名父母的风险,这将很难通过调用 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:* 中的所有内容移动到基本命名空间。然而,这可能会导致一些重命名。在调用它之前,您可能希望将重要节点放入一个集合中,以便找到它们。

于 2013-07-30T04:03:28.853 回答