我嘗試評估一些 Python 運算式,例如[1, 2, 3][1]. 我不能使用,eval('[1, 2, 3][1]')因為每次我這樣做時,一只小貓可能會死。更安全的方法是使用ast.literal_eval('[1, 2, 3][1]'),但是,它會引發 ValueError:
ValueError: malformed node or string ...
可以做些什么來使其發揮作用?提前致謝。
uj5u.com熱心網友回復:
可能有更好的方法,但如果格式與您描述的一樣(串列文字后跟方括號中的索引文字),那么您可以將其分成多個部分,單獨評估它們,然后將它們組合到您的邏輯中。
import re
from ast import literal_eval
string = '[1, 2, 3][1]'
m = re.match(r'^(\[. \])\[(. )\]$', string)
mylist = literal_eval(m.group(1))
index = literal_eval(m.group(2))
value = mylist[index]
# gives value 2
uj5u.com熱心網友回復:
如果它像從串列中選擇整數一樣簡單,您可以自己決議它。
s = "[1, 12, 30][-1]"
def foo(s):
arr = []
curr = ""
for c in s:
if c.isdigit() or c in ["-"]:
curr = c
elif c == "," or c == "]":
arr.append(int(curr))
curr = ""
lst, ind = arr[:-1], arr[-1]
return lst[ind]
foo(s)
# 30
或者可能
arr, ind = (
s.replace("][", ";").replace("[", "").replace("]", "").replace(" ", "").split(";")
)
int(arr.split(",")[int(ind)])
uj5u.com熱心網友回復:
您可以使用compile內置函式從輸入安全地生成 AST 。但是您不能安全地評估 AST。所以你必須自己走 AST,收集文字整數并從中列出一個串列。如果運算式像你說的那么簡單,那就不難了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/366293.html
上一篇:如何將字串串列轉換為浮點串列
