1

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

それがどこで間違っているのか考えていますか?前もって感謝します。

4

1 に答える 1

1

あなたは本当にとても近いです。Pyparsing の空白のスキップにはデフォルトで改行が含まれているため、infolineOneOrMoreは情報の 1 行を超えて読み取り、実際には最初の属性の「ローカル IP」まで読み取ります。パーサーは行指向であり、パーサーで改行が発生する可能性がある場所を明示的に示しているため、改行を無視できる空白としてスキップしないようにpyparsing に指示する必要があります。文法要素を定義する前に、次のようにします。

ParserElement.setDefaultWhitespaceChars(' \t')

これで、パーサーからより良い結果が得られるようになります。

その他のヒント:

  • Group around infoline と attrib_value_pair を使用して、解析されたデータに構造を追加します。

  • インフォラインを解析すると、OneOrMore 型の式によって['A', 'valid', 'message', 'has', 'been', 'received', 'from', 'a', 'peer']Wrap infoline withoriginalTextForのような行が得られます。これにより、インフォラインの一致したテキストが "A valid message etc...." という 1 つの文字列として復元されます。

pyparsing の作業を頑張ってください!

于 2013-01-09T13:59:29.627 に答える