![](/img/trans.png)
[英]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.