2011-12-14 4 views
8

Это моя первая попытка использовать Pyparsing, и я хотел бы спросить как фильтровать этот пример строки:Pyparsing пример

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

, чтобы получить выход как: 1,52.125133215643,21.031048525561,116.898812

В общем, у меня проблема с пониманием логики pyparsing, поэтому любая помощь с этим примером будет оценена. Благодаря

ответ

19

Вы могли бы начать с чем-то вроде этого:

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) 

Выход сценария:

[52.125133215643, 21.031048525561, 116.898812] 

Edit: Вы могли бы также рассмотреть вопрос о lepl, который подобную библиотеку, что это довольно красиво оформлено. Эквивалентный сценарий к приведенному выше:

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

Большое спасибо за вашу помощь! – daikini

+0

Несомненно, я проверю этот модуль – daikini

+0

Что делать, если я хочу также иметь '1' в списке? Это вернет '1.0', поскольку использует тип cast для float. есть ли способ бросить только это в int? –

Смежные вопросы