在 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”。修订前;这失败了:
revisionExpr = (
pyp.StringStart().leaveWhitespace() +
space +
pyp.Combine(alpha_rev +
pyp.Optional(num_rev)("rev"))
|
pyp.CaselessLiteral("Rev") + pyp.Optional('.') +
pyp.Combine(alpha_rev +
pyp.Optional(num_rev)("rev"))
)
for match_str, start, end in (
revisionExpr.scanString(rev_string, maxMatches=1)):
print match_str
print match_str
NameError: name 'match_str' is not defined
为什么是“|” 导致比赛失败?请注意,这适用于第一个和第二个示例:
revisionTokens = revisionExpr.parseString(rev_string)
如果我将最后一个示例的第二部分(“|”之后)提取为与第一个示例类似的形式,则添加“Rev”即可。在 rev_string 中的“K”前面。不幸的是,第一个表达式中的前导空格是唯一标识修订字符串所必需的,否则,在此示例中,“WI”将匹配。
我正在尝试使用 scanString 而不是 parseString 因为它返回匹配的开始和结束位置,这有助于稍后的处理。