Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在PyParsing中,如何指定一个或多个不以某个字符串开头的行?_Python_Pyparsing - Fatal编程技术网

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

Python 在PyParsing中,如何指定一个或多个不以某个字符串开头的行?,python,pyparsing,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:" +

我试图解析多行文件中的一些字段,其中我只对一些行感兴趣,而其他行我想跳过。下面是一个类似于我尝试做的事情的示例:

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"]
其中,非以
字段2:
开头的行的
Regex
从中改编。但是,运行这个示例脚本会给出一个

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

我希望
value2
42
结束,而不考虑行数(
foo\n
bar\n
)。如何实现这一点?

正则表达式中的“^”和“$”字符不是通过pyparsing逐行解释的,而是在被解析的整个字符串的上下文中解释的。因此“^”将仅在字符串的最开头匹配,而“$”仅在字符串的最末尾匹配

相反,您可以:

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