Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.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中跳过带有zero或more的非空令牌的正确方法_Python_Pyparsing - Fatal编程技术网

Python 在pyparsing中跳过带有zero或more的非空令牌的正确方法

Python 在pyparsing中跳过带有zero或more的非空令牌的正确方法,python,pyparsing,Python,Pyparsing,我有一些伪代码txt_block-[seq_block]-txt block[seq_block][seq block]。我想用存储序列提取所有txt和seq块 ZeroOrMore(nestedExpr('[', ']') | SkipTo(Literal('[')) | StringEnd())) 但解析会转到无限循环,因为SkipTo总是返回空字符串。简化示例: ZeroOrMore(SkipTo('p')).parseString('p') 当前我继承了带有空检查的SkipTo和co

我有一些伪代码
txt_block-[seq_block]-txt block[seq_block][seq block]
。我想用存储序列提取所有
txt
seq

ZeroOrMore(nestedExpr('[', ']') | SkipTo(Literal('[')) | StringEnd()))
但解析会转到无限循环,因为
SkipTo
总是返回空字符串。简化示例:

ZeroOrMore(SkipTo('p')).parseString('p')
当前我继承了带有空检查的
SkipTo
和copypaste
parseImpl
方法:

if not skipText:
     raise ParseException(instring, loc, self.errmsg, self)

但它看起来很丑。用pyparsing处理此伪代码的正确方法是什么?

下面是一个简单的演示,演示了您的情况:

from pyparsing import *

parser = "A" + SkipTo("B") + "B"

for test in ("ABC", "AXBC"):
    try:
        print test
        print parser.parseString(test)
    except ParseException as pe:
        print "exception:", pe
    print
这张照片是:

ABC
['A', '', 'B']

AXBC
['A', 'X', 'B']
第一场比赛是你不想要的——如果Skipot是空的,你不希望它成功

要在任何解析器元素上添加一些额外的验证,您可以定义一个解析操作,并让该方法在不满足验证规则时引发ParseException。在您的情况下,SkipTo元素的匹配标记不能为空。下面是一个检查此项的分析操作:

def mustNotBeEmpty(tokens):
    if not tokens[0]:
        raise ParseException("match must not be empty")

parser = "A" + SkipTo("B").setParseAction(mustNotBeEmpty) + "B"
现在,运行与上面相同的测试代码可以得到:

ABC
exception: match must not be empty (at char 0), (line:1, col:1)

AXBC
['A', 'X', 'B']