如果字符串为:
,我的代码应该返回None包含不受支持的运算符或非数字。支持的运算符为:**,*,^,-,+,/,(,)
示例
“ 4.0 + 2” 有效
“ 3.88327-$ 3.4”是无效(由于“ $”)
“ a + 24”是无效(因为“ a”)
“ 2 + 6”是有效
“ 4 + / 3”是无效(因为“ + /”是两个相邻的运算符)
“ 4 **-3” 有效
我该怎么做?
这是我的代码:
def checkvalid(string1):
temp = string1.split()
for i in len(temp):
if i in "*^-+/()":
return None
if not i.isnumeric():
return None
return string1
但这并不总是有效。它仅适用于“ 22 66”之类的常规整数->此方法有效,它返回字符串,但似乎没有其他效果,它始终返回None。
答案 0 :(得分:1)
自从我最初回答以来,您已经为这个问题添加了七个新要求。我与您脱离接触,因为我认为您需要在寻求更多帮助之前更好地了解所面临问题的范围。
但是,我将抛出另一个片段,这可能会使您走上正确的道路,因为您似乎正在寻找有效的数学表达式。下面的代码可以做到这一点:
def check_valid(data):
errors = (SyntaxError, NameError)
try:
eval(data)
except errors:
for i in data.split():
try:
eval(i)
except errors:
return None
return data
test = ["4++2", "4+-2", "4.0 + 2", "3.88327 - $3.4", "a + 24", "2+6", "4+/3"]
for t in test:
try:
assert check_valid(t)
print(f"{t} valid")
except AssertionError:
print(f"{t} not valid")
输出
4++2 valid
4+-2 valid
4.0 + 2 valid
3.88327 - $3.4 not valid
a + 24 not valid
2+6 valid
4+/3 not valid
在Python中,+可以重复任意次数,但仍然是有效的数学表达式,因为它只是反复更改整数的符号。
有多种方法可以解决此问题。以您的示例为例,您的逻辑存在一些缺陷:
in
关键字将一个字符串与另一个字符串进行比较。在第一个示例字符串中,序列“ 4.0”显然不在序列“ * ^-+ /()”中。运作方式示例:>>> "4.0" in "asdf4.012345"
True
>>> "4.0" in "0.4"
False
使用类似逻辑的快速解决方案是按字符而不是逐字检查,并将两个条件与and
组合在一起。尝试以下代码段:
def check_valid(data):
for word in data.split():
for character in word:
if character not in "*^-+/()." and not character.isnumeric():
return None
return data
test = ["4.0 + 2", "3.88327 - $3.4", "a + 24", "22 66", "2+6"]
for t in test:
print(f"Test: {check_valid(t)}")
输出
Test: 4.0 + 2
Test: None
Test: None
Test: 22 66
Test: 2+6
注意::我更改了一些名称,以更严格地遵循python代码样式的最佳做法。
答案 1 :(得分:0)
在评估中添加一些检查可以使其更加安全,尽管并不理想。
onclick()
答案 2 :(得分:-1)
另一种选择是使用正则表达式检查表达式是否包含无效字符;或使用字符串解析器。 因为您的表达式很简单,所以让python做我们的工作
def check_valid(expression: str):
try:
eval(expression) # Execute the expression; If the expression is valid, return the result of the evaluation; if is invalid; raise exception
return True
except Exception as _:
return False
if __name__ == '__main__':
print("{expression}: {validity}".format(expression="4.0 + 2", validity=check_valid("4.0 + 2")))
print("{expression}: {validity}".format(expression="3.88327 - $3.4", validity=check_valid("3.88327 - $3.4")))
print("{expression}: {validity}".format(expression="a + 24", validity=check_valid("a + 24")))
print("{expression}: {validity}".format(expression="2+6", validity=check_valid("2+6")))