Python 解析时出错<;属性值>;使用pyparsing的对

Python 解析时出错<;属性值>;使用pyparsing的对,python,pyparsing,Python,Pyparsing,我正在尝试使用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(Lin

我正在尝试使用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)
知道哪里出了问题吗?
提前谢谢。

你们真的很接近了。默认情况下,Pyparsing的空白跳过包括换行符,因此您的信息行
OneOrMore
将读取超过单行信息,实际上甚至将读取到第一个属性的“本地ip”。因为您的解析器是面向行的,并且您显式地显示了新行在解析器中的位置,所以您应该告诉pyparsing不要将新行作为可忽略的空白跳过。在定义任何语法元素之前,请执行以下操作:

ParserElement.setDefaultWhitespaceChars(' \t')
现在您将开始从解析器中看到更好的结果

其他一些提示:

  • 使用分组信息行和属性值对为解析数据添加结构

  • 解析信息行时,一个或多个类型表达式将为您提供一行,如
    ['a','valid','message','has','been','received','from','a','peer']
    将信息行包装为
    originalTextFor
    ,这将把信息行的匹配文本恢复为仅作为单个字符串的“有效消息等…”


祝你工作顺利

你真的很接近。默认情况下,Pyparsing的空白跳过包括换行符,因此您的信息行
OneOrMore
将读取超过单行信息,实际上甚至将读取到第一个属性的“本地ip”。因为您的解析器是面向行的,并且您显式地显示了新行在解析器中的位置,所以您应该告诉pyparsing不要将新行作为可忽略的空白跳过。在定义任何语法元素之前,请执行以下操作:

ParserElement.setDefaultWhitespaceChars(' \t')
现在您将开始从解析器中看到更好的结果

其他一些提示:

  • 使用分组信息行和属性值对为解析数据添加结构

  • 解析信息行时,一个或多个类型表达式将为您提供一行,如
    ['a','valid','message','has','been','received','from','a','peer']
    将信息行包装为
    originalTextFor
    ,这将把信息行的匹配文本恢复为仅作为单个字符串的“有效消息等…”


祝你工作顺利

保罗,你的解决方案很有效。谢谢只有一个关于小组建议的问题。它不应该是联合体而不是团体吗。我认为Group不会将令牌显示为一个完整的字符串,而Combine则可以。Paul,您的解决方案很好。谢谢只有一个关于小组建议的问题。它不应该是联合体而不是团体吗。我认为Group不会将令牌显示为一个完整的字符串,而Combine可以实现这一点。