2017-06-07 72 views
0

我正在編寫一個Python中的程序,它接受用戶輸入(不使用Python的內置input),它是一個包含字符串列表的字符串,即。 '["hello", "world"]'。但是,一些輸入內部會有多個引號,即。 '["Hello", "wor"ld"]'。我需要字符串總是eval()到一個列表。任何關於清理輸入字符串的建議,以確保它始終是eval?已經嘗試過.replace('"', '\"')引用中的Eval列表

+3

首先...不要使用'eval' ... –

+0

你最好使用'json.loads'。此外,我會建議你拋出一個錯誤,而不是打破你的頭。如果用戶將要輸入這樣的內容,那麼他​​們很可能會在周圍徘徊。 –

+0

那麼,在字符串中是否有隨機散佈的雙引號字符呢?在一般情況下處理這將會有很大的問題。 –

回答

0

這是一個有些困難的問題,因爲計算機很難知道哪些引用是無關的,哪些是預期的引用。我能想到的最佳解決方案是首先刪除所有雙引號和空格,然後在任何字符「[」的實例後加雙引號,在任何逗號後插入空格和雙引號,並在雙引號之前插入雙引號每個逗號和「]」。這不是一個優雅的解決方案,可能需要幾行代碼,但除非您可以在程序的早期對輸入進行清理,否則這可能是最佳解決方案。

0

我幾乎恨自己這樣做,但它可能實際上工作。首先,選擇一個不會被用戶輸入的符號(例如,字或〜)。然後,通過符號刪除有效引號在末開始和更換項目之間的所有有效引號:

s = '["Hello", "wor",ld" , " ]' 
s1 = re.sub(r"(\[\s*\")|(\"\s*,?\s*\])", "", s) 
# 'Hello", "wor",ld" , ' 
s1 = re.sub(r"\"\s*,\s*\"", "字", s1) 
# 'Hello字wor",ld" , ' 

最後,逃避所有剩餘的雙引號,與項分隔更換有趣的符號,並添加括號:

result = '["' + s1.replace('"', r'\"').replace("字",'","') + '"]' 
#'["Hello","wor\\",ld\\" , "]' 
ast.literal_eval(result) 
#['Hello', 'wor",ld" , ']