如何使用python、pyparsing按顺序解析文件中的行/匹配适当的结果?

如何使用python、pyparsing按顺序解析文件中的行/匹配适当的结果?,python,pyparsing,Python,Pyparsing,这是我的密码: from pyparsing import * survey =''' BREAK_L,PN1000,LA55.16469813,LN18.15054629 PN1,LA54.16469813,LN17.15054629,EL22.222 BREAK_L,PN2000,LA55.16507249,LN18.15125566 PN6,LA54.16506873,LN17.15115798,EL33.333 PN7,LA54.16507249,LN17.15125566,EL44.

这是我的密码:

from pyparsing import *

survey ='''
BREAK_L,PN1000,LA55.16469813,LN18.15054629
PN1,LA54.16469813,LN17.15054629,EL22.222
BREAK_L,PN2000,LA55.16507249,LN18.15125566
PN6,LA54.16506873,LN17.15115798,EL33.333
PN7,LA54.16507249,LN17.15125566,EL44.444
BREAK_L,PN3000,LA55.16507249,LN18.15125566
PN10,LA54.16507522,LN17.15198405,EL55.555
PN11,LA54.16506566,LN17.15139220,EL44.44
PN12,LA54.16517275,LN17.15100652,EL11.111
'''

digits = "0123456789"
number = Word(nums+'.').setParseAction(lambda t: float(t[0]))
num = Word(digits)
text = Word(alphas)
pt_id = Suppress('PN') + Combine(Optional(text) + num + Optional(text) + Optional(num))
separator = Suppress(',')
latitude = Suppress('LA') + number
longitude = Suppress('LN') + number

gps_line = pt_id + separator + latitude + separator + longitude
break_line = (Suppress('BREAK_L,')
          + pt_id
          + separator
          + latitude
          + separator
          + longitude)

result1 = gps_line.scanString(survey)
result2 = break_line.scanString(survey)

for item in result1:
    print item


通过上面的例子,我想找到一个解决方案,比如:

gps_线+它是break_线,在伪代码中是什么意思:

for every gps_line in result1:
    print gps_line + precedent break_line

若我的问题不清楚或不适合描述,请随意更改。

编辑#2
我试图实现的是输出:

['1', 54.16469813, 17.15054629, 22.222, 'BP1000', 55.16469813, 18.15054629]
['6', 54.16506873, 17.15115798, 33.333, 'BP2000', 55.16507249, 18.15125566]
['7', 54.16507249, 17.15125566, 44.444, 'BP2000', 55.16507249, 18.15125566]
['10', 54.16507522, 17.15198405, 55.555, 'BP3000', 55.16507249, 18.15125566]
['11', 54.16506566, 17.1513922, 44.44, 'BP3000', 55.16507249, 18.15125566]
['12', 54.16517275, 17.15100652, 11.111, 'BP3000', 55.16507249, 18.15125566]
第二次尝试:

from decimal import Decimal
from operator import itemgetter
survey ='''
BREAK_L,PN1000,LA55.16469813,LN18.15054629
PN1,LA54.16469813,LN17.15054629,EL22.222
BREAK_L,PN2000,LA55.16507249,LN18.15125566
PN6,LA54.16506873,LN17.15115798,EL33.333
PN7,LA54.16507249,LN17.15125566,EL44.444
BREAK_L,PN3000,LA55.16507249,LN18.15125566
PN10,LA54.16507522,LN17.15198405,EL55.555
PN11,LA54.16506566,LN17.15139220,EL44.44
PN12,LA54.16517275,LN17.15100652,EL11.111
'''

def parse_line(line):
  brk = False
  kv = {}
  for part in line.split(','):
    if part == 'BREAK_L':
      brk = True
    else:
      k = part[:2]
      v = part[2:]
      kv[k] = v
  return (brk,kv)

def parse_survey(survey):
  ig1 = itemgetter('PN','LA','LN','EL')
  ig2 = itemgetter('PN','LA','LN')
  brk_data = None
  for line in survey.strip().splitlines():
    brk, data = parse_line(line)
    if brk:
      brk_data = data
      continue
    else:
      yield ig1(data) + ig2(brk_data)

for r in parse_survey(survey):
  print r
收益率:

('1', '54.16469813', '17.15054629', '22.222', '1000', '55.16469813', '18.15054629')
('6', '54.16506873', '17.15115798', '33.333', '2000', '55.16507249', '18.15125566')
('7', '54.16507249', '17.15125566', '44.444', '2000', '55.16507249', '18.15125566')
('10', '54.16507522', '17.15198405', '55.555', '3000', '55.16507249', '18.15125566')
('11', '54.16506566', '17.15139220', '44.44', '3000', '55.16507249', '18.15125566')
('12', '54.16517275', '17.15100652', '11.111', '3000', '55.16507249', '18.15125566')
这与我之前的尝试没有太大区别。我已经为你配对了数据。我假设您可以自己将
1000
更改为
BP1000

第二次尝试:

from decimal import Decimal
from operator import itemgetter
survey ='''
BREAK_L,PN1000,LA55.16469813,LN18.15054629
PN1,LA54.16469813,LN17.15054629,EL22.222
BREAK_L,PN2000,LA55.16507249,LN18.15125566
PN6,LA54.16506873,LN17.15115798,EL33.333
PN7,LA54.16507249,LN17.15125566,EL44.444
BREAK_L,PN3000,LA55.16507249,LN18.15125566
PN10,LA54.16507522,LN17.15198405,EL55.555
PN11,LA54.16506566,LN17.15139220,EL44.44
PN12,LA54.16517275,LN17.15100652,EL11.111
'''

def parse_line(line):
  brk = False
  kv = {}
  for part in line.split(','):
    if part == 'BREAK_L':
      brk = True
    else:
      k = part[:2]
      v = part[2:]
      kv[k] = v
  return (brk,kv)

def parse_survey(survey):
  ig1 = itemgetter('PN','LA','LN','EL')
  ig2 = itemgetter('PN','LA','LN')
  brk_data = None
  for line in survey.strip().splitlines():
    brk, data = parse_line(line)
    if brk:
      brk_data = data
      continue
    else:
      yield ig1(data) + ig2(brk_data)

for r in parse_survey(survey):
  print r
收益率:

('1', '54.16469813', '17.15054629', '22.222', '1000', '55.16469813', '18.15054629')
('6', '54.16506873', '17.15115798', '33.333', '2000', '55.16507249', '18.15125566')
('7', '54.16507249', '17.15125566', '44.444', '2000', '55.16507249', '18.15125566')
('10', '54.16507522', '17.15198405', '55.555', '3000', '55.16507249', '18.15125566')
('11', '54.16506566', '17.15139220', '44.44', '3000', '55.16507249', '18.15125566')
('12', '54.16517275', '17.15100652', '11.111', '3000', '55.16507249', '18.15125566')

这与我之前的尝试没有太大区别。我已经为你配对了数据。我假设您可以自己将
1000
更改为
BP1000

当主题数据易于机器读取时,我倾向于避免pyparsing。我想要的结果只是“复制并粘贴”两个独立循环的编译:对于result1中的项,对于result2中的项。抱歉,如果这有误导性,我只是想演示示例输出。我的输入[survey='''''.'''''''''.'']只是为了这个问题而创建的一个示例。哦,那么您的示例输入与生成示例输出的数据不一样!?这是一样的,但它是从两个独立的循环中取出来的,比如:对于结果1中的x:print x,然后对于结果2中的y:print y,然后,出于示例目的,我手动匹配了它。当主题数据易于机器读取时,我倾向于避免pyparsing。我想要的结果只是两个独立循环的“复制和粘贴”编译:对于result1中的项,对于result2中的项。抱歉,如果这有误导性,我只是想演示示例输出。我的输入[survey='''''.'''''''''.'']只是为了这个问题而创建的一个示例。哦,那么您的示例输入与生成示例输出的数据不一样!?这是一样的,但它是从两个独立的循环中取出来的,比如:对于result1:print x中的x,然后对于result2:print y中的y,为了示例的目的,我手动匹配了它。