以下代码
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(")")
知道如何修复/解决这个问题吗?
答案 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是默认值)。