Математические операции из строки
Скажем, у меня есть стандартная строка Python (например, полученная из raw_input()
), возможно, "2 + 2"
для простоты.
Я хотел бы преобразовать эту строку в стандартные математические операции в Python, чтобы "2 + 2"
возвращал 4
.
Есть ли простой способ сделать это, или мне нужно разделить на пространства и разобрать каждый номер/символ вручную, а затем выполнить математику на основе того, что я нахожу?
Я хочу Regex?
Ответы
Ответ 1
Используйте функцию eval.
print eval('2 + 4')
Вывод:
6
Вы даже можете использовать переменные или обычный код python.
a = 5
print eval('a + 4')
Вывод:
9
Вы также можете получить возвращаемые значения:
d = eval('4 + 5')
print d
Вывод:
9
Или функции вызова:
def add(a, b):
return a + b
def subtract(a, b):
return a - b
a = 20
b = 10
print eval('add(a, b)')
print eval('subtract(a, b)')
Вывод:
30
10
Если вы хотите написать парсер, возможно, вместо этого вы можете построить генератор кода python, если это проще и использовать eval для запуска кода. С помощью eval вы можете выполнить любую оценку Python.
С другой стороны, как говорили другие, eval небезопасен, поэтому используйте его с умом.
Ответ 2
Regex не поможет. Прежде всего, вам нужно будет учесть приоритет операторов, а во-вторых, вам нужно работать с круглыми скобками, что невозможно с регулярным выражением.
В зависимости от того, какое именно выражение вам нужно проанализировать, вы можете попробовать либо Python AST, либо (более вероятно) pyparsing.
Но, прежде всего, я бы рекомендовал прочитать что-то о синтаксическом анализе в целом и алгоритм шунтирования в частности.
И сразитесь с искушением использовать eval
, что небезопасно.
Ответ 3
Самый простой способ - использовать eval
как в:
>>> eval("2 + 2")
4
Обратите внимание на то, что я включил пробелы в строку. eval
будет исполнять строку, как если бы это был код Python, поэтому, если вы хотите, чтобы вход находился в синтаксисе, отличном от Python, вы должны сами проанализировать строку и вычислить, например eval("2x7")
не даст вам 14, потому что Python использует *
для оператора умножения, а не x
.
Ответ 4
Если вы хотите сделать это безопасно, вы можете использовать http://docs.python.org/library/ast.html#ast.literal_eval
из этого ответа:
Python" safe " eval (строка в bool/int/float/None/string)
Он может не выполнять математику, но вы можете анализировать математические операторы, а затем работать с безопасно оцененными терминами.
Ответ 5
Ответчик прокомментировал:
Я полагаю, что если я достаточно хорошо понимаю проблему, чтобы написать программу, которая может понять это, мне не нужно делать эту работу вручную.
Если он напишет решение математического выражения в качестве учебного упражнения, использование eval()
не поможет. Плюс это ужасный дизайн.
Вы можете подумать о том, чтобы сделать калькулятор, используя Reverse Polish Notation вместо стандартной математической нотации. Это значительно упрощает синтаксический анализ. Это все равно будет хорошим упражнением.
Ответ 6
Вы можете использовать эту функцию, которая выполняет ту же функцию, что и функция eval()
, но простым способом, используя функцию.
def numeric(equation):
if '+' in equation:
y = equation.split('+')
x = int(y[0])+int(y[1])
elif '-' in equation:
y = equation.split('-')
x = int(y[0])-int(y[1])
return x
Ответ 7
Простым способом, но опасным способом сделать это будет использование eval()
. eval()
выполняет строку, переданную ему как код. Опасная вещь в том, что, если эта строка получена от пользовательского ввода, они могут злонамеренно выполнять код, который может сломать компьютер. Я бы получил вход, проверил его с помощью регулярного выражения, а затем выполнил его, если вы определите, все ли в порядке. Если он будет только в формате "номер номер операции", вы можете использовать простое регулярное выражение:
import re
s = raw_input('What is your math problem? ')
if re.findall('\d+? *?\+ *?\d+?', s):
print eval(s)
else:
print "Try entering a math problem"
В противном случае вам придется придумать что-то более строгое, чем это. Вы также можете сделать это наоборот, используя регулярное выражение, чтобы определить, нет ли в нем определенных вещей, таких как числа и операции. Также вы можете проверить, содержит ли вход определенные команды.
Ответ 8
Лучший способ:
print eval("2 + 2")
Если вы хотите, чтобы вы могли использовать переменную:
addition = eval("2 + 2")
print addition
Если вы действительно этого захотите, вы можете использовать функцию:
def add(num1, num2):
eval("num1 + num2")