我一直在努力写出一行正则表达式来分割我需要的一切。我真的想尽我所有的可能性,然后再诉诸第二次数据。
目前,我一直在使用此正则表达式将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目前无法解决,因为处理成千上万行数据花费的时间太长。
有人知道这样的表达吗?
答案 0 :(得分:1)
您可以通过两个捕获组来捕获所需的零件,然后将它们连接起来:
r'"([^"\\]*(?:\\.[^"\\]*)*)"|([^\s();]+)'
^ ^ ^ ^
之所以会成功,是因为捕获组一次只能填充一个,其中一个始终为空:
["{}{}".format(x,y) for x, y in re.findall(r'"([^"\\]*(?:\\.[^"\\]*)*)"|([^\s();]+)', line)]
请参见Python demo