在parseString给出正确结果的情况下,无法使scanString正常工作。在
这个序列起作用:
alpha_rev = pyp.Word(pyp.alphas, max=2)
num_rev = pyp.Word('123456789', max=2)
space = pyp.White(ws=" ").suppress()
revisionExpr = (
pyp.StringStart().leaveWhitespace() +
space +
pyp.Combine(alpha_rev +
pyp.Optional(num_rev)("rev"))
)
rev_string = ' K WI, This is the title'
for match_str, start, end in (
revisionExpr.scanString(rev_string, maxMatches=1)):
print match_str
['K']
有时在修订之前会有一个“Rev”或“Rev.”;这是失败的:
^{pr2}$为什么“|”导致比赛失败?请注意,这适用于第一个和第二个示例:
revisionTokens = revisionExpr.parseString(rev_string)
如果我把最后一个例子的第二部分(在“|”之后)提取成与第一个例子一样的形式,那么在Rev_字符串中的“K”前面加上“Rev.”就可以了。不幸的是,第一个表达式中的前导空格是唯一标识修订字符串所必需的,否则,在本例中,“WI”将匹配。在
我尝试使用scanString而不是parseString,因为它返回匹配的开始和结束位置,这有助于以后的处理。在
问题是,您的“or”操作符(“|”)只查看其左右两侧的元素。语法元素分组不正确。以下是你的语法再分解一下:
正如您所看到的,这并不是您想要的——它将查找文本“Rev”或实际的修订,然后是另一个修订。表达式的固定版本如下:
^{pr2}$但是,您可以使语法更加简洁:
在这个版本中,您只在预期的位置将“Rev.”文本标记为可选,而不是让parse选择只解析修订或“Rev.”+修订。这完全避免了使用“|”运算符所引起的任何问题。在
别忘了PyParsing使用操作符重载来提供更好的语法,如果语法导致混乱(就像在这个场景中),那么您最好只使用长形式的方法调用,比如“pyp.或(a,b)”。在
相关问题 更多 >
编程相关推荐