问题描述
在以下代码中,对于值 is_number
,"foo"
是 False,但是对于该字符串,这仍然打印 is a number
。为什么?我该如何解决?
def string_is_number(a_string):
pattern = re.compile(r'[0-9]+')
if pattern.search(a_string):
return("True")
else:
return("False")
for value in 42,0.5,"foo":
the_string = str(value)
is_number = string_is_number(the_string)
print(the_string,is_number)
if is_number:
print(the_string,"is a number")
输出:
42 True
42 is a number
0.5 True
0.5 is a number
foo False
foo is a number
解决方法
返回一个 bool
,而不是一个 str
:
if pattern.search(a_string):
return True
else:
return False
Python 中的任何非空字符串都被认为是真(或“真”),包括 "False"
:
>>> bool("False")
True
当然,您的号码检测的正则表达式有点偏离:
re.match("^\d+([.,]\d+)?$",a_string)
将是一个更严格的测试。
,您试图将“True”和“False”作为字符串返回。您需要像这样将它们作为布尔值返回:
def string_is_number(a_string):
pattern = re.compile(r'[0-9]+')
return pattern.search(a_string) # Returns True or False
,
您的函数失败是因为您返回了非空字符串,这些字符串总是True
。一个更微妙的问题是,你将任何至少有一位数的东西称为数字。所以“我不是数字1”是一个数字。检查某物是否为“数字”的一种好方法是尝试对其进行转换。在您的情况下,您似乎正在处理整数和浮点数,它们都可以转换为 float
。由于字符串文字中不允许使用逗号,因此需要将其分解,但您的函数可能是
def string_is_number(a_string):
try:
float(a_string.strip(','))
return True
except:
return False