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
「|」はなぜですか 試合を失敗させますか?これは、最初の例と2番目の例の両方で機能することに注意してください。
revisionTokens = revisionExpr.parseString(rev_string)
最後の例の2番目の部分(「|」の後)を最初の例のような形式に抽出すると、「Rev」を追加すると機能します。rev_stringの「K」の前。残念ながら、最初の式の先頭の空白は、リビジョン文字列を一意に識別するために必要です。そうでない場合、この例では「WI」が一致します。
parseStringの代わりにscanStringを使用しようとしています。これは、一致の開始位置と終了位置を返すため、後の処理に役立ちます。