2017-06-07 8 views
0

私は、文字列のリストを含む文字列であるユーザー入力(Pythonの組み込みのinputを使用しない)を取り込むプログラムをPythonで書いています。 '["hello", "world"]'。しかし、いくつかの入力は、内部に複数の引用符を持ちます。 '["Hello", "wor"ld"]'。リストには常にeval()という文字列が必要です。入力文字列をクレンジングして常に評価するようにするためのアドバイスはありますか?既に試した.replace('"', '\"')引用符内の評価リスト

+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" , '] 
関連する問題