Я пытаюсь использовать 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 (первый ключ: значение пары), то почему он не находит начало линии? Каков правильный синтаксис пипарации для распознавания строк, начинающихся без пробелов, и строк, начинающихся с пробелов?
Спасибо - состояние 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