PyParsing, совпадающие строки, начинающиеся с белого - PullRequest
2 голосов
/ 04 июля 2019

Учитывая следующую грамматику, чувствительную к символам новой строки, как я могу игнорировать комментарии, начинающиеся с пробелов?

pp.LineStart() + pp.Optional(pp.White(" \t")) + '#' не соответствует строкам, начинающимся с пробелов, как и следовало ожидать.

import pyparsing as pp
pp.ParserElement.setDefaultWhitespaceChars(' \t')

def Line(expr): return expr + pp.Suppress(pp.LineEnd())

foo = Line(pp.Group(pp.OneOrMore(pp.Word(pp.alphas))))

parser = pp.OneOrMore(foo)

comment = '#' + pp.restOfLine()
parser.ignore(pp.LineStart() + pp.Optional(pp.White(" \t")) + pp.Optional(comment) + pp.LineEnd())
parser.ignore(comment)

text = """

 foo abc
# comment
bar # comment
"""

results = parser.parseString(text, parseAll=True)
assert list(results[0]) == ['foo', 'abc']

text = """

foo abc
 # comment
bar
"""

results = parser.parseString(text, parseAll=True)

print "ok"

1 Ответ

1 голос
/ 08 июля 2019

Строки, содержащие только комментарий, могут оставить висячий конец строки на входе.Измените парсер на:

parser = pp.OneOrMore(foo | pp.LineEnd().suppress())
...