我正在尝试使用pyparsing解析日志文件。 日志文件条目的结构如下:
information line 1
information line 2
...
information line n
attribute name 1 = attribute value 1
attribute name 2 = attribute value 2
...
attribute name n = attribute value n
我已经编写了这个语法来解析这个文本块:
NL = Suppress(LineEnd())
infoline = OneOrMore(Word(alphas + ".-")) + NL
attrib_value_pair = OneOrMore(Word(alphas)) + Suppress("=") + \
OneOrMore(Word(alphanums + ".")) + NL
data = OneOrMore(infoline) + OneOrMore(attrib_value_pair)
parsed_data = data.parseString(trace_block)
我在解析时收到此错误:
Traceback (most recent call last):
File "filter.py", line 100, in <module>
get_trace_block()
File "filter.py", line 25, in get_trace_block
filter_trace(trace_block)
File "filter.py", line 53, in filter_trace
get_attrib_name_value_pairs(trace_block[2:len(trace_block)])
File "filter.py", line 94, in get_attrib_name_value_pairs
parsed = data.parseString(trace_block)
File "/usr/local/lib/python2.6/dist-packages/pyparsing.py", line 1006, in parseString
raise exc
pyparsing.ParseException: Expected end of line (at char 70), (line:2, col:26)
日志文件中的示例行:
A valid message has been received from a peer
Message type is A
local ip = 10.7.1.10
local port = 3000
remote ip = 10.7.1.20
remote port = 3001
知道哪里出错了? 提前谢谢。
答案 0 :(得分:1)
你真的很亲密。默认情况下,Pyparsing的空格跳过包括换行符,因此您的infoline OneOrMore
将读取单行信息,实际上甚至会读取第一个属性的“local ip”。由于您的解析器是面向行的,并且您明确显示解析器中可能出现换行的位置,因此您应该告诉pyparsing 不将新行跳过为可忽略的空格。在定义任何语法元素之前执行此操作:
ParserElement.setDefaultWhitespaceChars(' \t')
现在,您将开始从解析器中看到更好的结果。
其他一些提示:
使用infoline和attrib_value_pair周围的组来为您的解析数据添加结构。
解析你的infolines时,OneOrMore类型表达式会给你一行['A', 'valid', 'message', 'has', 'been', 'received', 'from', 'a', 'peer']
Wrap infoline with originalTextFor
,这会将infoline的匹配文本恢复为“A”有效的消息等......“作为单个字符串
你的pyparsing工作祝你好运!