如何使用Python从复杂的字符串中提取、比较和转换数据?

2024-04-25 09:41:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一系列的Maya MEL命令,我正在尝试用Python读入、比较和转换这些命令。我能读懂台词,但提取所需数据时遇到困难。每个命令行包含一个标识符和一系列有序变量,通常只有3个,但始终与同一标识符的另一行的变量数对称。你知道吗

例如,我可能有以下文件:

// Default Lip Positions - 15_0504
setAttr("Lower_Lips.translate", 1.670481893, 10.29264716, 0.0005245589302)  ;
setAttr("Lower_Lips.rotate", 80.13419306, -90, 0);
setAttr("Lower_Lips.scale", 1, 1, 1) ;
setAttr("Lower_Lips.cv[12]", -0.5607159408, -0.815908366, 10.34516376) ;
setAttr("Lower_Lips.cv[11]", -0.5142785558, -0.9430959629, 10.29982363) ;   
// Default 15_0726
setAttr("Lower_Lips.translate", 1.670481893, 10.29264716, 0.0005245589302);
setAttr("Lower_Lips.rotate", 80.13419306, -90, 0) ;
setAttr("Lower_Lips.cv[11]", -0.4987127378, -0.9397891962, 10.31868927);
setAttr("Lower_Lips.scale", 1, 1, 1) ;
setAttr("Lower_Lips.cv[12]", -0.5437445653, -0.815908366, 10.36395894) ;

我需要将标识符(双引号之间的文本)和相关值提取到数据结构中。我还需要忽略注释或空行。第一个元组是这样的:

('Lower_Lips.translate', '1.670481893','10.29264716','0.0005245589302')

更复杂的命令行元组是:

('Lower_Lips.cv[12]', '-0.5607159408', '-0.815908366', '10.34516376')

然后我就可以查找重复的标识符,并对它们的两组值执行一些操作,比如查找差异。我试着用Regex实现它,并尽可能地找出标识符的模式如下:

re.compile('.*"([^"]*)".*')

Tags: 命令行命令default标识符lowercvtranslate元组
1条回答
网友
1楼 · 发布于 2024-04-25 09:41:53

您可以尝试用f.read()读入整个文件,然后在内容上应用此正则表达式代码:

import re
p = re.compile(r'^setAttr\("([^"]*)",\s+(\S*),\s+(\S*),\s+(\S*)\)\s*;', re.MULTILINE)
test_str = "// Default Lip Positions - 15_0504\nsetAttr(\"Lower_Lips.translate\", 1.670481893, 10.29264716, 0.0005245589302)  ;\nsetAttr(\"Lower_Lips.rotate\", 80.13419306, -90, 0);\nsetAttr(\"Lower_Lips.scale\", 1, 1, 1) ;\nsetAttr(\"Lower_Lips.cv[12]\", -0.5607159408, -0.815908366, 10.34516376) ;\nsetAttr(\"Lower_Lips.cv[11]\", -0.5142785558, -0.9430959629, 10.29982363) ;   \n// Default 15_0726\nsetAttr(\"Lower_Lips.translate\", 1.670481893, 10.29264716, 0.0005245589302);\nsetAttr(\"Lower_Lips.rotate\", 80.13419306, -90, 0) ;\nsetAttr(\"Lower_Lips.cv[11]\", -0.4987127378, -0.9397891962, 10.31868927);\nsetAttr(\"Lower_Lips.scale\", 1, 1, 1) ;\nsetAttr(\"Lower_Lips.cv[12]\", -0.5437445653, -0.815908366, 10.36395894) ;"
print(re.findall(p, test_str))

正则表达式

^setAttr\("([^"]*)",\s+(\S*),\s+(\S*),\s+(\S*)\)\s*;

只需检查每一行,并从每一行中提取符合模式的必要数据。你知道吗

相关问题 更多 >