Re: Parser stl et regexp

Page principale

Répondre à ce message
Auteur: YP
Date:  
À: guilde
Sujet: Re: Parser stl et regexp
Le 21/03/2013 12:56, Frédéric a écrit :
> Hello,


Hello,

> Petite questions aux guru regexp...
>
> Je voudrais parser un fichier stl. En ascii, c'est de la forme :
>
>          solid _40x10
>              facet normal 0.000000e+000 0.000000e+000 1.000000e+000
>                  outer loop
>                      vertex 1.286803e+001 2.957990e+001 1.200000e+001
>                      vertex 1.173648e+001 2.984808e+001 1.200000e+001
>                      vertex 1.115715e+001 2.953001e+001 1.200000e+001
>                  endloop
>              endfacet
>              facet normal 0.000000e+000 0.000000e+000 1.000000e+000
>                  outer loop
>                      vertex 1.115715e+001 2.953001e+001 1.200000e+001
>                      vertex 1.173648e+001 2.984808e+001 1.200000e+001
>                      vertex 1.058145e+001 2.998308e+001 1.200000e+001
>                  endloop
>              endfacet
>              ...
>          endsolid _40x10

>
> Je voudrais pouvoir récupérer des groupes :
>
> - le(s) groupe(s) de lignes compris entre 'solid/endsolid'
> - le(s) groupe(s) de lignes compris entre 'facet/endfacet'
> - le(s) groupe(s) de lignes compris entre 'solid/endsolid'
> - le(s) groupe(s) de lignes compris entre 'outer loop/endloop'


J'ai enlevé les "print", mais ce n'est amha pas trop illisible :)
On dirait même presque du Java :p

#!/usr/bin/env python
import re
string = open('data.stl', 'r').read()

for solide in re.findall('solid\s(.*?)endsolid', string, re.S):
   ref = re.match('(^.*?)$', solide, re.M)
   facetnum = 1
   for facette in re.findall('facet\s(.*?)endfacet', solide, re.S):
     facetnum += 1
     loopnum = 1
     for outerloop in re.findall('outer\sloop(.*?)endloop', facette, re.S):
       loopnum += 1
       vertexnum = 1
       for coordonnee in re.findall('vertex\s(.*)$', outerloop, re.M):
         xyz = re.match('(.[^\s]*)\s(.[^\s]*)\s(.[^\s]*)$', coordonnee)
         x = xyz.group(1)
         y = xyz.group(2)
         z = xyz.group(3)
         vertexnum += 1


++

Yves