私は、文書のコメントからpyparsingを使用してkey:valueのペアを解析しようとしています。キーは行の先頭から始まり、値が続きます。空白で始まる複数の行に値を続けることができます。pyparsing LineStartの使い方は?
import pyparsing as pp
instring = """
-- This is (a) #%^& comment
/*
name1: val
name2: val2 with $*&#@) junk
name3: val3: with @)(*% multi-
line: content
*/
"""
comment1 = pp.Literal("--") + pp.originalTextFor(pp.SkipTo(pp.LineEnd())).setDebug()
identifier = pp.Word(pp.alphanums + "_").setDebug()
meta1 = pp.LineStart() + identifier + pp.Literal(":") + pp.SkipTo(pp.LineEnd())
meta2 = pp.LineStart() + pp.White() + pp.SkipTo(pp.LineEnd())
metaval = meta1 + pp.ZeroOrMore(meta2)
metalist = pp.ZeroOrMore(comment1) + pp.Literal("/*") + pp.OneOrMore(metaval) + pp.Literal("*/")
if __name__ == "__main__":
p = metalist.parseString(instring)
print(p)
はで失敗:
Matched {Empty SkipTo:(LineEnd) Empty} -> ['This is (a) #%^& comment']
File "C:\Users\user\py3\lib\site-packages\pyparsing.py", line 2305, in parseImpl
raise ParseException(instring, loc, self.errmsg, self)
pyparsing.ParseException: Expected start of line (at char 32), (line:4, col:1)
pyparsing whitespace match issuesに対する答えが
LineStart has always been difficult to work with, but ...
パーサーが行4列1である場合に言う(最初のキー:値対)、次いで理由でありますそれは行の開始を見つけることができません?空白で始まらない行と空白で始まる行を認識する正しいpyparsing構文は何ですか?
ありがとうございます - pp.col条件は、トリックです。しかし、以下の答えに示されているように、stopOn引数は正しく動作していません。pp.Literalでは動作しますが、pp.Wordでは動作しません。あなたが次のリリースに取り組んでいるときに考慮すべきこと。 – Dave
LineStartの改良版が2.1.10でリリースされました。 – PaulMcG
これは私のために働く: 'seq = OneOrMore(Word(nums)、stopOn = Word(" 0 ")); print(seq.parseString( "349875 2330 204 123 000")) 'は' ['349875'、 '2330'、 '204'、 '123'] 'を返します。 – PaulMcG