2

pyparsingコードをデバッグしようとしたときに、この予期しない動作に遭遇しました。

string1 = "this is a test string : that behaves as I expect\n"
string2 = "this string does not behave as I expect\n"

field = CharsNotIn(":\n")
line = field + ZeroOrMore(Literal(":") + field) + LineEnd()

print line.parseString(string1)
print line.parseString(string2)

これにより、次の出力が生成されます。

['this is a test string ', ':', ' that behaves as I expect', '\n']
['this string does not behave as I expect']

何らかの理由で、パーサーはで行末文字を取得string1できますが、で取得できませんstring2string2それが行末を拾わなかった場合、それがどのようにマッチを生み出すことができたのかさえ理解できません。

行末以外の文字を使用すると正常に機能するように見えるため、この動作は行末文字に特有のようです。

string1 = "this is a test string : that behaves as I expect*"
string2 = "this string also behaves as I expect*"

field = CharsNotIn(":*")
line = field + ZeroOrMore(Literal(":") + field) + Literal("*")

print line.parseString(string1)
print line.parseString(string2)

これにより、次のものが生成されます。

['this is a test string ', ':', ' that behaves as I expect', '*']
['this string also behaves as I expect', '*']
4

1 に答える 1

1

行を印刷して、一致する疑似正規表現を確認します。

>>> print line
{!W:(:
) [{":" !W:(:
)}]... LineEnd}

私がこの権利を理解していれば、コロン以外の改行文字以外を探しています。これは最初の改行で停止し(string2の例では、行全体を取ります)、コロンと他の単語が存在する場合は探します(存在しません) t)、次に改行。私の推測では、改行インスタンスが何らかの形でドロップされているのではなく、改行に一致できなかった場合に文字列に一致しないというあなたの主張が偽であるということではありません。

>>> print line.parseString('xyzyy')
['xyzyy']

これは、改行がなくてもなぜ一致するのかという疑問を残します...

于 2012-09-30T04:51:02.917 に答える