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