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
和copypasteparseImpl
方法:
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']