在 PyParsing 中,如何指定一个或多个不以某个字符串开头的行?

In PyParsing, how to specify one or more lines which do not start with a certain string?

我正在尝试从多行文件中解析某些字段,其中我只对某些行感兴趣,而其他我想跳过。这是一个类似于我正在尝试做的事情的例子:

from pyparsing import *

string = "field1: 5\nfoo\nbar\nfield2: 42"

value1 = Word(nums)("value1")
value2 = Word(nums)("value2")
not_field2 = Regex(r"^(?!field2:).*$")

expression = "field1:" + value1 + LineEnd() + OneOrMore(not_field2)+ "field2:" + value2 + LineEnd()

tokens = expression.parseString(string)

print tokens["value1"]
print tokens["value2"]

其中不以 field2: 开头的行的 Regex 改编自 Regular expression for a string that does not start with a sequence。但是,运行 这个示例脚本给出了

pyparsing.ParseException: Expected Re:('^(?!field2:).*$') (at char 10), (line:2, col:1)

我希望 value242 结束,而不管行数(在本例中为 foo\nbar\n)。我怎样才能做到这一点?

您的正则表达式中的“^”和“$”字符不是由 pyparsing 逐行解释的,而是在被解析的整个字符串的上下文中解释的。所以'^'将在字符串的开头匹配only,在字符串的最后匹配'$'only

相反,您可以这样做:

not_field2 = LineStart() + Regex(r"(?!field2:).*")