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" 十六进制值被解释为 '\n' 并且即使使用 leaveWhitespace 调用也不会被视为普通字符。

我也尝试过使用 SkipTo 但我没有设法处理转义的内括号,例如:

"( I am \( John \))"

使用解析器

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

知道如何解决/解决这个问题吗?

4

3 回答 3

2

Try prefixing your strings with r. That is if you have a string

"(\x01\x0a)"

change it to

r"(\x01\x0a)"

What happens is that slashes get interpreted right away and don't reach pyparsing. You have text.parseString("(\x01\x0a)") and it's exactly the same as text.parseString("(\x01\n)") .

于 2013-06-04T07:30:29.883 回答
1

这是我最终找到的解决方案:

escaped_paren = Literal("\(") | Literal("\)")
text = "(" + SkipTo(")", ignore=escaped_paren)
于 2013-06-04T08:48:33.437 回答
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. 如果你还是要去掉 () 的,不妨让 pyparsing 为你做这件事,并将这个参数作为 True 传递(或者直接忽略它,因为 True 是默认值)。

于 2013-06-04T20:16:33.310 回答