我试图使用pyparsing从文档中的注释解析键:值对。一个键从一行的开始处开始,然后是一个值。值可以在以空格开头的多行上继续。如何使用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