繁体   English   中英

如何用字符串进行数学运算?

[英]How to do math operations with string?

如果 a 有字符串calculation = '1+1x8' 如何将其转换为calculation = 1+1*8 我试着做类似的事情

for char in calculation:
    if char == 'x':
        calculation = calculation.replace('x', *)

    # and

    if char == '1':
        calculation = calculation.replace('1', 1)

这显然行不通,因为您不能只用 integer 替换一个字符。 整个字符串必须是 integer,如果我这样做,它也不起作用,因为我无法将'x''+'转换为整数

让我们以更复杂的字符串为例: 1+12x8 下面是一个粗略的大纲; 您需要为每个步骤提供实现。

首先,将其标记化,将1+12x8转换为['1', '+', '12', 'x', '8'] 对于这一步,您需要编写分词器或词法分析器。 这是定义运算符和文字的步骤。

接下来,将令牌 stream 转换为解析树。 也许您将树表示为S 表达式['+', '1', ['x', '12', '8']][operator.add, 1, [operator.mul, 12, 8]] . 这一步需要编写一个解析器,这需要您定义诸如运算符的优先级之类的东西。

最后,您编写了一个评估器,可以将您的解析树简化为单个值。 分两步执行此操作可能会产生

  1. [operator.add, 1, [operator.mul, 12, 8]][operator.add, 1, 96]
  2. [operator.add, 1, 96]97

你可以这样写:

def parse_exp(s):
    return eval(s.replace('x','*'))

并扩展您想要使用的任何其他异国符号。

为了限制 eval 的风险,您还可以消除坏字符:

import string

good = string.digits + '()/*+-x'

def parse_exp(s):
    s2 = ''.join([i for i in s if i in good])
    return eval(s2.replace('x','*'))

编辑:额外的好处是内置的eval function 将处理括号和一般计算规则之类的事情:)

编辑2:正如另一位用户指出的那样, eval 可能很危险 因此,仅当您的代码只能在本地运行时才使用它

将代码添加到 chepner 的建议中:

标记 '1+12x8' -> ['1', '+', '12', 'x', '8']。 使用运算顺序 '/*+-' -> reduce 计算 1 + (12*8) 返回答案

import re
import operator




operators = {
        '/': operator.truediv,
        'x':operator.mul,
        '+':operator.add,
        '-':operator.sub,

    }

def op(operators, data):
    # apply operating to all occurrences 

    for p in operators:
        while p in data:
            x = data.index(p)
            replacer = operators.get(p)(int(data[x-1]) , int(data[x+1]))
            data[x-1] = replacer
            del data[x:x+2]


    return data[0]


def func(data):
    # Tokenize

    d = [i for i in re.split('(\d+)', data) if i ]

    # Use order of operations 
    d = op(operators, d)

    return d


s1 = "1+1x8"
s2 = '2-4/2+5'


s = func(s1) # 9
print(s)

t = func(s2) #-5
print(t)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM