Đối với giải pháp không sử dụng eval, dưới đây là những gì tôi sẽ làm. Bắt đầu bằng cách tìm tất cả các biểu thức toán học trong chuỗi, mà tôi sẽ xác định như là một chuỗi có chứa khoảng trắng, dấu ngoặc đơn, số, và các hoạt động, sau đó loại bỏ các trận đấu mà tất cả các khoảng trắng:
>>> 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]
Tiếp theo, đánh giá các biểu thức bằng cách sử dụng lớp NumericStringParser
từ this question, trong đó sử dụng pyparsing:
>>> nsp = NumericStringParser()
>>> results = [nsp.eval(my_str[e.start():e.end()]) for e in exprs]
>>> results
[30.0]
sau đó, để thay thế các kết quả trở lại vào biểu hiện, ngược lại loại những biểu hiện bởi chỉ số bắt đầu của họ và đặt chúng trở lại vào chuỗi gốc:
>>> 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'
là bài tập về nhà này? –
http://stackoverflow.com/questions/2371436/evaluating-a-mathematical-expression-in-a-string –
@jeffery_the_wind không thực sự ở điểm, vì điều này (không giống như vậy) yêu cầu loại bỏ các phần phi toán học của chuỗi. –