用于解析基于语法的文件格式的良好python策略

时间:2013-01-18 02:23:18

标签: python parsing format grammar

我为3D文件格式编写了不少简单的导入程序,如PLY和OBJ,它们似乎具有非常基于状态的每行结构,使得解析非常容易。我的朋友希望我使用python从mirai为文件类型实现一个简单的导入器,我注意到可以有很多层次表示的数据,这与我之前使用的更简单的逐行格式不同。

我想知道我是否应该尝试使用一些python库创建一个完整的语法,一些复杂的正则表达式,或者我应该使用字符串替换来解决一些解决方案。任何人都可以为解析这种类型的文件提供任何好的建议吗?此特定示例是导出的多维数据集。

 filetype gx;
 GrammarVersion 2.1.0.0;
 TemplateVersion 2.1.0.0;
 HostName "ZOO-HP";
 UserName "Phil";
 TimeStamp "Mon 20-Aug-12, 9:48 pm";
 OSName "Windows NT 6.01.7601";
 ApplicationName "Mirai";
 ApplicationVersion "1.1.0.1 5629";
 include "gbf-2-1-0-0.tpl";
 include "cube_mirai.gmf";


 body Polyhedron-31 (

   vertices[] < (
coord -0.500000 -0.500000 0.500000 ;
 )
 (
coord -0.500000 0.500000 0.500000 ;
 )
 (
coord 0.500000 0.500000 0.500000 ;
 )
 (
coord 0.500000 -0.500000 0.500000 ;
 )
 (
coord 0.500000 -0.500000 -0.500000 ;
 )
 (
coord 0.500000 0.500000 -0.500000 ;
 )
 (
coord -0.500000 0.500000 -0.500000 ;
 )
 (
coord -0.500000 -0.500000 -0.500000 ;
 )
>
   faces[] < (
normal 0.000000 0.000000 1.00000 ;
      vertex-indices[] <0;1;2;3;>
      vertex-normal-indices[] <0;1;2;3;> )
 (
normal 0.000000 0.000000 -1.00000 ;
      vertex-indices[] <4;5;6;7;>
      vertex-normal-indices[] <4;5;6;7;> )
 (
normal 0.000000 1.00000 0.000000 ;
      vertex-indices[] <1;6;5;2;>
      vertex-normal-indices[] <1;6;5;2;> )
 (
normal 0.000000 -1.00000 0.000000 ;
      vertex-indices[] <7;0;3;4;>
      vertex-normal-indices[] <7;0;3;4;> )
 (
normal 1.00000 0.000000 0.000000 ;
      vertex-indices[] <3;2;5;4;>
      vertex-normal-indices[] <3;2;5;4;> )
 (
normal -1.00000 0.000000 0.000000 ;
      vertex-indices[] <7;6;1;0;>
      vertex-normal-indices[] <7;6;1;0;> )
>
   normals[] <-0.577350 -0.577350 0.577350 ;
-0.577350 0.577350 0.577350 ;
0.577350 0.577350 0.577350 ;
0.577350 -0.577350 0.577350 ;
0.577350 -0.577350 -0.577350 ;
0.577350 0.577350 -0.577350 ;
-0.577350 0.577350 -0.577350 ;
-0.577350 -0.577350 -0.577350 ;
>
 )

1 个答案:

答案 0 :(得分:1)

要解析这么大的构造,我会避免手工制作复杂的正则表达式;它们的维护/调试成本太高。

我想看看PyParsing,它有相当大的examplesPLY范围。

其中任何一个都允许您以更结构化的方式解析文件,这应该更易于维护。它们也将更容易扩展到简单的立方体示例之外,以涵盖mirai文件格式的全部范围。