簡體   English   中英

解析錯誤 <attribute value> 使用pyparsing對

[英]Error in parsing <attribute value> pairs using 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(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

知道哪里出了問題嗎? 提前致謝。

你真的很親密 Pyparsing的默認空格跳躍包括換行,所以你的信息熱線OneOrMore會讀過去信息的單行,居然會讀連成第一屬性的“本地IP”。 由於解析器是面向行的,並且您要明確顯示解析器中可能出現換行符的位置,因此您應該告訴pyparsing 不要將換行符忽略為可忽略的空白。 在定義任何語法元素之前,請執行以下操作:

ParserElement.setDefaultWhitespaceChars(' \t')

現在,您將開始從解析器中看到更好的結果。

其他一些技巧:

  • 使用信息線周圍的組和attrib_value_pair將結構添加到已解析的數據中。

  • 解析信息行時,OneOrMore類型表達式將為您提供諸如['A', 'valid', 'message', 'has', 'been', 'received', 'from', 'a', 'peer']originalTextFor包裹信息行,這會將信息行的匹配文本還原為“有效消息等...”作為單個字符串

祝您pyparsing工作順利!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM