0
def parse(expression):
    operators= set("*/+-")
    numbers= set("0123456789")#not used anywhere as of now
    opExtrapolate= []
    numExtrapolate= []
    buff=[]
    for i in expression:
        if i in operators:
            if len(buff) >0: #prevents buff if multiple operators
                numExtrapolate.append(''.join(buff))
            buff= []
            opExtrapolate.append(i)
            opExtrapolation=opExtrapolate
        else:
            buff.append(i)


    numExtrapolate.append(''.join(buff))

    numExtrapolation=numExtrapolate
    print(numExtrapolation)
    print("z:", len(opExtrapolation))
    return numExtrapolation, opExtrapolation

def errors():

    numExtrapolation,opExtrapolation=parse(expression)
    #Error for muliple operators
    if (len(numExtrapolation) ==3) and (len(opExtrapolation) !=2):
        print("Bad1")
    if (len(numExtrapolation) ==2) and (len(opExtrapolation) !=1):
        print("Bad2")
    #

我在一个较旧的问题中发布了类似的代码,但是在这篇文章中问题的前提是不同的。

上面的代码接受用户在变量表达式中输入的数学输入,并将其拆分为操作数和运算符。如果输入不正确,errors 函数稍后会打印错误。

输入看起来像这样,其中运算符只能在 set("*/+-") 中,操作数是实数。因此示例输入为 45/23+233

在 SO 用户的帮助下,我能够使其中一个错误正常工作(多个操作员的错误),但是我在实现更多错误消息时遇到了麻烦。

1)如果输入包含不是数字或不允许的运算符的项目,则显示错误消息

2)如果用户输入一个数字,例如 0.23 或类似 554 的数字。如果小数位之前或小数位之后没有数字,则会显示不同的错误。(请注意,像 0.23 这样的数字很好)。

3) 如果用户试图除以零,则会显示错误。

::我尝试过的:

在 parse() 的 else 语句中,我尝试在 buff.append(i) 上设置条件,以便它仅在 buff.isdigit()==true 时运行该代码,但我收到错误提示 buff 中没有数字. 我还尝试创建一个名为“数字”的集合(在下面的代码中),并通过类似于初始 for 语句的 for 语句将 buff.append(i) 限制为该集合。但不幸的是,没有任何效果。任何和所有的帮助将不胜感激。

请不要引入大量比下面代码更高级的代码。我正在尝试解决问题,而不是完全更改我的代码。感谢你的帮助。

4

2 回答 2

2

您可以使用正则表达式进行这些检查:

  1. 如果输入包含不是数字或不允许的运算符的项目,则会显示错误消息

    if not re.match(r'[\d.*/+\- ]+$', expression):
        print("Bad3")  # Characters exist that are not allowed
    

    说明:[\d.*/+\- ]将仅匹配数字、您的运算符和空格、+允许这些字符中的一个或多个字符的方法,以及$字符串末尾的匹配项。 re.match()从字符串的开头开始,因此这意味着只允许使用这些字符。

  2. 如果用户输入诸如 0.23 或 554 之类的数字。如果小数位之前或小数位之后没有数字,则会显示不同的错误。(请注意,像 0.23 这样的数字很好)。

    if re.search(r'(?<!\d)\.|\.(?!\d)', expression):
        print("Bad4")  # There is a '.' without a digit before or after it
    

    说明:\.在正则表达式中匹配文字 '.' 特点。中间|是一个交替,所以如果正则表达式两边的表达式匹配,则正则表达式将匹配。 (?<!\d)表示前一个字符不是数字,(?!\d)表示下一个字符不是数字,所以这个正则表达式的意思是“匹配一个'。” 前面没有数字或匹配“。” 后面没有数字”。

  3. 如果用户试图除以零,则会显示错误。

    if re.search(r'/ *[0.]+(?![.\d])', expression):
        print("Bad5")  # Division by 0
    

    说明:这匹配/后跟任意数量的空格,然后是一个或多个0or.字符,因此如果expression您的任何地方有类似/ 0,/ 0.0或的内容,这将匹配/ 0.00。这(?![.\d])意味着下一个字符不能是数字或.,这将阻止您匹配类似/ 0.4.

于 2012-11-02T18:19:03.183 回答
1

我会给你一些指示,但不会为你解决:)。如果您需要更多,请提出一个准确的问题,我会回答。

我给你的答案与你的代码没有直接关系。

您可以通过尝试强制转换来测试字符串变量是否可以是整数:

try:
    var2 = int(var)

我让你看看它给出了什么错误

对于不使用try的版本,可以看isdigit方法

您可以通过检查它来查看字符串变量是否是您的运算符之一

if (var in ["+", "-", "/", "*"])

要检查更多,您可以先查看变量的长度

if len(var) != and ... see above

要检查用户是否输入了类似 .543 的内容并拒绝它,并且可以查看字符串变量的第一个元素:

if myvar[0] is ".":

要检查您的用户是否要除以 0,您只需检查最后一个数字是否等于 0

if int(myvar) == 0:

不过,所有这些都希望您能够首先获得运算符和数字。

另一种解决方案是在解析数字和运算符之前使用正则表达式来执行这些检查。与您尝试完成的练习相比,它似乎相当复杂,因为它是家庭作业。无论如何,看看它们可能是个好主意。

于 2012-11-02T18:18:10.303 回答