Подтвердить что ты не робот

Математические операции из строки

Скажем, у меня есть стандартная строка Python (например, полученная из raw_input()), возможно, "2 + 2" для простоты.

Я хотел бы преобразовать эту строку в стандартные математические операции в Python, чтобы "2 + 2" возвращал 4.

Есть ли простой способ сделать это, или мне нужно разделить на пространства и разобрать каждый номер/символ вручную, а затем выполнить математику на основе того, что я нахожу?

Я хочу Regex?

4b9b3361

Ответ 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")