Para una solución sin usar eval, esto es lo que haría. Comience por encontrar todas las expresiones matemáticas en la cadena, que definiré como una cadena que contiene espacios, paréntesis, números y operaciones, y luego tira a los partidos que son todos los espacios en blanco:
>>> import re
>>> my_str = 'I have 6 * (2 + 3) apples'
>>> exprs = list(re.finditer(r"[\d\.\s\*\+\-\/\(\)]+", my_str))
>>> exprs = [e for e in exprs if len(my_str[e.start():e.end()].strip()) > 0]
A continuación, evaluar las expresiones que utilizan la clase NumericStringParser
de this question, que utiliza pyparsing:
>>> nsp = NumericStringParser()
>>> results = [nsp.eval(my_str[e.start():e.end()]) for e in exprs]
>>> results
[30.0]
Entonces, para sustituir los resultados de nuevo en la expresión, revertir ordenar las expresiones de su índice de partida y colocarlos de nuevo en la cadena original:
>>> new_str = my_str
>>> for expr, res in sorted(zip(exprs, results), key=lambda t: t[0].start(), reverse=True):
... new_str = new_str[:expr.start()] + (" %d " % res) + new_str[expr.end():]
...
>>> new_str
'I have 30 apples'
Es esta tarea? –
http://stackoverflow.com/questions/2371436/evaluating-a-mathematical-expression-in-a-string –
@jeffery_the_wind no está realmente en el punto, ya que esto (a diferencia de eso) requiere descartar partes de la cadena que no sean matemáticas. –