使用pyparsing匹配行首空格
我正在尝试用pyparsing来解析一个统一的diff文件,作为练习,但遇到了一些问题。这里是我diff文件中让我困扰的部分:
(... some stuff over...)
banana
+apple
orange
第一行以一个空格开始,然后是“banana”。我用来解析一行的表达式是:
linestart = Literal(" ") | Literal("+") | Literal("-")
line = linestart.leaveWhitespace() + restOfLine
这个表达式在解析单行时是有效的,但当我尝试解析整个文件时,“leaveWhitespace”这个指令让解析器从最后一行的末尾开始。举个例子,在解析完“ banana”后,下一个字符是“\n”(因为有leaveWhitespace),然后解析器试图匹配“ ”、“+”或“-”,结果就出错了。
我该如何正确处理这个问题呢?
1 个回答
1
你可以一次读取并解析一行内容。下面的代码对我来说很好用。
from pyparsing import Literal, restOfLine
linestart = Literal(" ") | Literal("+") | Literal("-")
line = linestart.leaveWhitespace() + restOfLine
f = open("/tmp/test.diff")
for l in f.readlines():
fields = line.parseString(l)
print fields
输出结果是
[' ', 'banana']
['+', 'apple']
[' ', 'orange']
如果你需要解析多行内容,可以明确指定行结束符。
linestart = Literal(" ") | Literal("+") | Literal("-")
line = linestart.leaveWhitespace() + restOfLine + LineEnd()
lines = ZeroOrMore(line)
lines.parseString(f.read())