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

时间:2017-05-24 15:29:02

标签: python pyparsing

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

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"]

Regular expression for a string that does not start with a sequence改编不以Regex开头的行的field2:。但是,运行此示例脚本会提供

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

我希望value2最终为42,无论行数是多少(foo\nbar\n。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

正则表达式中的'^'和'$'字符不是通过pyparsing逐行解释的,而是在解析整个字符串的上下文中。所以'^'将在字符串的最开头匹配 ,而在最后只匹配<$>

相反,你可以这样做:

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