使用pyparsing匹配行首空格

1 投票
1 回答
1301 浏览
提问于 2025-04-16 07:22

我正在尝试用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())

撰写回答