1

次のコード

text = QuotedString(quoteChar="(", endQuoteChar=")", escChar="\\")
text.leaveWhitespace()

def test_hex_with_backslashN_code(self):
    self.assertEqual(text.parseString("(\x01\x0a)")[0], "(\x01\x0a)")

例外をトリガーします。

ParseException: Expected quoted string, starting with ( ending with ) (at char 0), (line:1, col:1)

"\x0a" hex 値は '\n' として解釈され、leaveWhitespace 呼び出しでも通常の文字として考慮されないためです。

SkipTo も試しましたが、次のようなエスケープされた内側のブラケットを処理できませんでした。

"( I am \( John \))"

パーサーで

text = "(" + SkipTo(")")

それを修正/回避する方法はありますか?

4

3 に答える 3

2

文字列に接頭辞を付けてみてくださいr。それはあなたが文字列を持っている場合です

"(\x01\x0a)"

に変更します

r"(\x01\x0a)"

何が起こるかというと、スラッシュはすぐに解釈されて に到達しませんpyparsing。あなたが持っていてtext.parseString("(\x01\x0a)")、それは とまったく同じtext.parseString("(\x01\n)")です。

于 2013-06-04T07:30:29.883 に答える
1

kirelagin が特定したバックスラッシュの問題に対処するこの解決策を試してください。

text = QuotedString(quoteChar="(", endQuoteChar=")", escChar="\\", unquoteResults=False)

print text.parseString(r"(\x01\x0a)")
assert(text.parseString(r"(\x01\x0a)")[0] == r"(\x01\x0a)")

版画:

['(\\x01\\x0a)']

引用文字が含まれると想定したので、引数を追加しますunquoteResults=False。とにかく () を削除する場合は、pyparses に任せて、この引数を True として渡します (または、True がデフォルト値であるため、省略します)。

于 2013-06-04T20:16:33.310 に答える
1

これが私が最終的に見つけた解決策です:

escaped_paren = Literal("\(") | Literal("\)")
text = "(" + SkipTo(")", ignore=escaped_paren)
于 2013-06-04T08:48:33.437 に答える