带有反斜杠的带反斜杠的带引号的字符串

时间:2013-06-04 07:17:14

标签: python pyparsing

以下代码

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”hexa值被解释为'\ n',即使使用leaveWhitespace调用也不会将其视为普通字符。

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

"( I am \( John \))"

使用解析器

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

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

3 个答案:

答案 0 :(得分:2)

尝试使用r为字符串添加前缀。那就是你有一个字符串

"(\x01\x0a)"

将其更改为

r"(\x01\x0a)"

会发生什么事情是直接解释斜线并且不会达到pyparsing。您有text.parseString("(\x01\x0a)")且其完全text.parseString("(\x01\n)")相同。

答案 1 :(得分:1)

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

escaped_paren = Literal("\(") | Literal("\)")
text = "(" + SkipTo(")", ignore=escaped_paren)

答案 2 :(得分: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是默认值)。