PyParsing忽略了换行符?

时间:2015-06-10 17:35:03

标签: python pyparsing

我想解析一个如下所示的git日志文件:

d2436fa AuthorName 2015-05-15 Commit Message
4    3    README.md

我期待的输出看起来像这样:

[ ['d2436fa', 'AuthorName', '2015-05-15', 'Commit Message'],
[4, 3, 'README.md'] ]

我解析这个的语法是:

hsh = Word(alphanums, exact=7)
author = OneOrMore(Word(alphas + alphas8bit + '.'))
date = Regex('\d{4}-\d{2}-\d{2}')
message = OneOrMore(Word(printables + alphas8bit))
count = Word(nums)
file = Word(printables)
blankline = LineStart() + LineEnd()

commit = hsh + Combine(author, joinString=' ', adjacent=False) + \
         date + Combine(message, joinString=' ', adjacent=False) + LineEnd()
changes = count + count + file + LineEnd()
check = commit ^ changes ^ blankline

我实际获得的输出是:

['d2436fa', 'AuthorName', '2015-05-15', 'Commit Message 4 3 README.md']

为什么新线被忽略了?我认为这就是LineEnd()的用途?当我分开'\ n'时一切正常:/

1 个答案:

答案 0 :(得分:2)

pyparsing有关于语法空格的(有争议的?)rule

  

在匹配过程中,默认情况下会跳过令牌之间的空格(虽然可以更改)

而且,正如它所说,它可以改变。您可以通过执行以下操作来设置被pp视为空白的内容:

i_consider_whitespaces_to_be_only = ' '
ParserElement.setDefaultWhitespaceChars(i_consider_whitespaces_to_be_only)

(这会告诉它只使用空格,而不是新行;当然,你也可以添加其他内容,例如标签。)