我正在尝试从多行文件中解析一些字段,其中我只对某些行感兴趣,而其他我想跳过的字段。这是一个类似于我正在尝试做的事情的例子:
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\n
和bar\n
。我怎样才能做到这一点?
答案 0 :(得分:1)
正则表达式中的'^'和'$'字符不是通过pyparsing逐行解释的,而是在解析整个字符串的上下文中。所以'^'将在字符串的最开头匹配 ,而在最后只匹配<$> 。
相反,你可以这样做:
not_field2 = LineStart() + Regex(r"(?!field2:).*")