使用正则表达式将 Maya ASCII 命令拆分为片段

Split Maya ASCII Command into Fragments using Regex

我一直在努力编写一个单行正则表达式来拆分我需要的一切。在我第二次重新评估我的数据之前,我真的想用尽我所有的可能性。

目前我一直在使用这个正则表达式将一行 ascii 数据拆分成片段:

line = 'setAttr -s 2 ".iog[0].og"'
re.split(r'("[^"\]*(?:\.[^"\]*)*"|[^\s();]+)', line)

// Result: ['setAttr', '-s', '2', '".iog[0].og"']

我真正想要的是仅捕获字符串引号中的文本以及所有常规单词、数字和标志:

// Result: ['setAttr', '-s', '2', '.iog[0].og']

我知道这看起来很愚蠢,但是执行时间是这段代码的主要成败。 Shlex 目前不在考虑范围内,因为它处理数千行数据的时间太长了。

有人知道这样的表达方式吗?

您可以使用两个捕获组捕获您需要的部分,然后将它们连接起来:

r'"([^"\]*(?:\.[^"\]*)*)"|([^\s();]+)'
   ^                      ^  ^         ^

它会起作用,因为一次只会填充一个捕获组,其中一个将始终为空:

["{}{}".format(x,y) for x, y in re.findall(r'"([^"\]*(?:\.[^"\]*)*)"|([^\s();]+)', line)]

Python demo