2011-12-14 16 views
8

è il mio primo tentativo di utilizzare pyparsing e mi piacerebbe chiedere come filtrare questa linea del campione:pyparsing esempio

survey = '''GPS,PN1,LA52.125133215643,LN21.031048525561,EL116.898812''' 

per ottenere output come: 1,52.125133215643,21.031048525561,116.898812

In generale ho problemi con la comprensione della logica di pyparsing, quindi qualsiasi aiuto con questo esempio sarà apprezzato. Grazie

risposta

19

Si potrebbe iniziare con qualcosa di simile:

from pyparsing import * 

survey = '''GPS,PN1,LA52.125133215643,LN21.031048525561,EL116.898812''' 

number = Word(nums+'.').setParseAction(lambda t: float(t[0])) 
separator = Suppress(',') 
latitude = Suppress('LA') + number 
longitude = Suppress('LN') + number 
elevation = Suppress('EL') + number 

line = (Suppress('GPS,PN1,') 
     + latitude 
     + separator 
     + longitude 
     + separator 
     + elevation) 

print line.parseString(survey) 

L'output dello script è:

[52.125133215643, 21.031048525561, 116.898812] 

Edit: Si potrebbe anche prendere in considerazione lepl, che è una libreria simile che è abbastanza ben documentato. Lo script equivalente a quello sopra è:

from lepl import * 

survey = '''GPS,PN1,LA52.125133215643,LN21.031048525561,EL116.898812''' 

number = Real() >> float 

with Separator(~Literal(',')): 
    latitude = ~Literal('LA') + number 
    longitude = ~Literal('LN') + number 
    elevation = ~Literal('EL') + number 

    line = (~Literal('GPS') 
      & ~Literal('PN1') 
      & latitude 
      & longitude 
      & elevation) 

print line.parse(survey) 
+0

Grazie mille per il vostro aiuto! – daikini

+0

Certo, controllerò questo modulo – daikini

+0

E se volessi avere anche '1' nell'elenco? Questo restituirà '1.0' poiché usa cast di tipo float. c'è un modo per lanciare solo questo in int? –