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")
#
我在一个较旧的问题中发布了类似的代码,但问题的前提在这篇文章中有所不同。
上面的代码采用用户在变量表达式中输入的数学输入,并将其拆分为操作数和运算符。如果输入不正确,错误功能将在以后打印错误。
输入看起来像这样,运算符只能在集合中(“* / + - ”),操作数是实数。所以输入的示例是45/23 + 233
在SO用户的帮助下,我能够解决其中一个错误(多个操作员的错误),但是我在实现更多错误消息时遇到了麻烦。
1)如果输入包含不是数字的项目或不允许的操作符,则显示错误消息
2)如果用户输入的数字如.23或554之类的数字,小数点前或小数点后面没有数字,则显示不同的错误。(注意0.23之类的数字很好)。
3)如果用户试图除以零,则显示错误。
::我尝试过:
在parse()的else语句中,我尝试在buff.append(i)上设置条件,以便只有buff.isdigit()== true才会运行该代码但是我得到错误说没有buff中的数字。我还尝试创建一个名为“numbers”的集合(在下面的代码中),并通过类似于first语句的for语句将buff.append(i)限制为该集合。但遗憾的是没有任何效果。任何和所有的帮助将不胜感激。
请不要引入比以下代码更高级的大量代码。我正在尝试解决问题,而不是彻底改变我的代码。谢谢你的帮助。
答案 0 :(得分:2)
您可以使用正则表达式进行这些检查:
如果输入包含非数字的项目或不包含允许的运算符,则会显示错误消息
if not re.match(r'[\d.*/+\- ]+$', expression):
print("Bad3") # Characters exist that are not allowed
说明:[\d.*/+\- ]
仅匹配数字,您的运算符和空格,+
表示允许其中一个或多个字符,以及最后的$
匹配字符串。 re.match()
从字符串的开头开始,这意味着只允许这些字符。
如果用户输入的数字如.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)
表示下一个字符不是数字,因此此正则表达式表示“匹配a”。不是数字的OR或者匹配''。没有数字“。
如果用户尝试除以零,则会显示错误。
if re.search(r'/ *[0.]+(?![.\d])', expression):
print("Bad5") # Division by 0
说明:这匹配/
后跟任意数量的空格,然后匹配一个或多个0
或.
个字符,因此如果expression
中的任何位置匹配,则匹配类似/ 0
,/ 0.0
或/ 0.00
的内容。 (?![.\d])
表示下一个字符不能是数字或.
,这会阻止您匹配/ 0.4
之类的内容。
答案 1 :(得分:1)
我会给你一些指示,但不能为你解决:)。 如果您需要更多,请提出一个确切的问题,我会回答。
我给你的答案与你的代码没有直接关系。
您可以通过尝试强制转换来测试字符串变量是否为整数:
try:
var2 = int(var)
我让你看看它给出了什么错误
对于不使用try的版本,您可以查看isdigit method
您可以通过检查
来查看是否有一个字符串变量if (var in ["+", "-", "/", "*"])
要检查更多,你可以先查看变量的长度
if len(var) != and ... see above
检查用户是否输入类似.543的内容并拒绝它,并查看字符串变量的第一个元素:
if myvar[0] is ".":
要检查您的用户是否想要除以0,您只需检查最后一个数字是否等于0
if int(myvar) == 0:
所有这些都希望您能够首先获得运营商和号码。
另一种解决方案是在解析数字和运算符之前使用正则表达式执行这些检查。 与您尝试实现的练习相比,它似乎相当复杂,因为它是家庭作业。无论如何,最好还是看看它们。