我最近开始使用 pyparsing,但遇到以下问题:有些数据按列组织,其中列数未知,此外,这样的部分可能在输入中出现多次。例如,请参见下面的代码。
# -*- coding: utf-8 -*-
from pyparsing import *
from decimal import Decimal
def convert_float(a):
return Decimal(a[0].replace(',','.'))
def convert_int(a):
return int(a[0])
NL = LineEnd().suppress()
dot = Literal('.')
dates = Combine(Word(nums,exact=2) + dot + Word(nums,exact=2) + dot + Word(nums,exact=4))
day_with_date = Word(alphas,exact=3).suppress() + dates
amount = ( Combine(OneOrMore(Word(nums)) + ',' + Word(nums),adjacent=False) +
Optional(Literal('EUR')).suppress() ).setParseAction(convert_float)
number = Word(nums).setParseAction(convert_int)
item_head = OneOrMore(Keyword('Item').suppress() + number)
item_det = Forward()
item_foot = Forward()
def defineColNumber(t):
nbcols = len(t)#[0])
item_det << Dict(Group(day_with_date('date') + Group(nbcols*amount)('data')))
item_foot << Keyword('TOTAL').suppress() + Group(nbcols*amount)
sec = (item_head('it*').setParseAction(defineColNumber) +
Group(OneOrMore(item_det))('details*') +
item_foot('totals*'))
parser = OneOrMore(
sec
)
parser.ignore(NL)
out = """
Item 1 Item 2 Item 3
Sat 20.04.2013 3 126 375,00 EUR 115 297,00 EUR 67 830,00 EUR
Fri 19.04.2013 1 641 019,20 EUR 82 476,00 EUR 48 759,00 EUR
Thu 18.04.2013 548 481,10 EUR 46 383,00 EUR 29 810,00 EUR
Wed 17.04.2013 397 396,70 EUR 42 712,00 EUR 26 812,00 EUR
TOTAL 8 701 732,00 EUR 1 661 563,00 EUR 1 207 176,00 EUR
Item 4 Item 5
Sat 20.04.2013 126 375,00 EUR 215 297,00 EUR
Fri 19.04.2013 2 641 019,20 EUR 32 476,00 EUR
Thu 18.04.2013 548 481,10 EUR 56 383,00 EUR
Wed 17.04.2013 397 396,70 EUR 42 712,00 EUR
TOTAL 2 701 732,00 EUR 1 663 563,00 EUR
"""
p = parser.parseString(out, parseAll=True)
print p.dump()
print p.it
print p.details[0]['18.04.2013'].data[2]
print p.totals
目前例如 p.it 看起来[[1, 2, 3], [4, 5]]
我需要[1,2,3,4,5]
的其他部分也是如此,所以p.details[0]['18.04.2013'].data[2]
我可以这样做p.details['18.04.2013'].data[2]
。
我没有想法 - 是否可以以某种简单的方式加入结果,或者我需要使用其他功能更改 ParseResults?
感谢帮助。
顺便说一句——这段代码对解析日期、金额等有意义吗?