2016-06-14 92 views
2

我要拆分的ASCII文本shlex:Python中逃脫引號3

1 'K\^o, Suk\'e' 

被打印爲Python字符串

line = "1 'K\\^o, Suk\\'e'\n" 

['1', 'K\\^o, Suk\\'e'] 

shlex.split(line)不工作,給出ValueError("No closing quotation")

我嘗試添加到wordchars如下:

>>> lexer = shlex.shlex(line) 
>>> lexer.wordchars += "\\'" 
>>> list(lexer) 
['1', "'K\\", '^', 'o', ',', "Suk\\'e'"] 

但同樣,這不是我的本意。

沒有報價,一切正常:

>>> line2= "1 'K\\^o, Suk\\e'\n" 
>>> shlex.split(line2) 
['1', 'K\\^o, Suk\\e'] 

如何這個問題能解決?

編輯:我來最接近的是:

>>> lexer = shlex.shlex(line) 
>>> lexer.wordchars += "\\'" 
>>> lexer.wordchars += " " 
>>> lexer.wordchars += "\\^" 
>>> lexer.wordchars += "," 
>>> list(lexer) 
['1', "'K\\^o,", "Suk\\'e'"] 

這仍然是不正確的。

編輯:示例字符串有點誤導。它也應該能夠分裂,說

>>> l1 = "C12 H2 'Hello friend'" 

shlex得到l1沒有問題。

+0

爲什麼它會分裂的第一空間,而不是第二個? –

+0

@VasiliSyrakis:因爲第二個單引號內。 – jwodder

+1

@Aquiles:我的ascii文件中的文本是'1'K \^o,Suk \'e''。當使用'f.readlines()'加載它時,它被打印爲'''K','Suk''e'\ n「'。希望這能夠澄清我的意思。 – user14717

回答

1

您可以使用POSIX模式和escapedquotes'",而不是僅僅"

>>> line = "1 'K\\^o, Suk\\'e'\n" 
>>> lexer = shlex.shlex(line, posix=True) 
>>> lexer.escapedquotes = "'\"" 
>>> list(lexer) 
['1', "K\\^o, Suk'e"] 
0

使用正則表達式可能更簡單。這個將在任何空格之前分割爲第一個標記,然後是其餘的字符串。

re.match('(\S+)\s+(.*)', line).groups() 
+0

不,我唯一的假設就是ascii,雖然我仍然可以使用你的方法,但是...... – user14717

+0

看到我的編輯回答了一個更一般的令牌拆分 – Riaz

+0

這是一個非常好的正則表達式,但在'line =「C1 C2 C3」'上失敗,'shlex.split'處理得很好。 – user14717