Per una soluzione senza l'utilizzo di eval, ecco cosa farei. Comincia a trovare tutte le espressioni matematiche nella stringa, che io definirei una stringa che contiene spazi, parentesi, numeri e operazioni, poi striscia fuori i fiammiferi che sono tutti gli spazi:
>>> 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]
Avanti, valutare le espressioni utilizzando la classe NumericStringParser
da this question, che utilizza pyparsing:
>>> nsp = NumericStringParser()
>>> results = [nsp.eval(my_str[e.start():e.end()]) for e in exprs]
>>> results
[30.0]
Poi, per sostituire i risultati indietro nell'espressione, invertire ordinare le espressioni dal loro indice iniziale e metterli indietro nella stringa originale:
>>> 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'
È questo compito? –
http://stackoverflow.com/questions/2371436/evaluating-a-mathematical-expression-in-a-string –
@jeffery_the_wind non proprio sul punto, in quanto ciò (a differenza di questo) richiede l'eliminazione delle parti non matematiche della stringa. –