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