[英]With pyparsing, how do you parse a quoted string that ends with a backslash
[英]Quoted string with a backslash with 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(")")
知道如何修复/解决这个问题吗?
尝试用r
字符串添加前缀。 那就是你有一个字符串
"(\x01\x0a)"
改为
r"(\x01\x0a)"
发生的事情就是直接解释斜线并且不会达到pyparsing
。 你有text.parseString("(\\x01\\x0a)")
,它与text.parseString("(\\x01\\n)")
完全相同 。
这是我终于找到的解决方案:
escaped_paren = Literal("\(") | Literal("\)")
text = "(" + SkipTo(")", ignore=escaped_paren)
试试这个解决方案,它解决了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是默认值)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.