【发布时间】:2017-02-27 02:21:57
【问题描述】:
如何检测字符串中的数字或字母?我知道您使用 ASCII 码,但哪些功能可以利用它们?
【问题讨论】:
-
见this list,尤其是
str.isdigit()和str.isalpha()。
如何检测字符串中的数字或字母?我知道您使用 ASCII 码,但哪些功能可以利用它们?
【问题讨论】:
str.isdigit()和str.isalpha()。
您可以使用str.isdigit() 和str.isalpha() 分别检查给定字符串是否为非负整数(0 或更大)和字母字符。
示例结果:
# For alphabet
>>> 'A'.isdigit()
False
>>> 'A'.isalpha()
True
# For digit
>>> '1'.isdigit()
True
>>> '1'.isalpha()
False
str.isdigit() 返回False 如果字符串是负 数字或浮点数。例如:
# returns `False` for float
>>> '123.3'.isdigit()
False
# returns `False` for negative number
>>> '-123'.isdigit()
False
如果您想同时检查 负 整数和 float,那么您可以编写一个自定义函数来检查它:
def is_number(n):
try:
float(n) # Type-casting the string to `float`.
# If string is not a valid `float`,
# it'll raise `ValueError` exception
except ValueError:
return False
return True
示例运行:
>>> is_number('123') # positive integer number
True
>>> is_number('123.4') # positive float number
True
>>> is_number('-123') # negative integer number
True
>>> is_number('-123.4') # negative `float` number
True
>>> is_number('abc') # `False` for "some random" string
False
上述函数将为“NAN”(非数字)字符串返回 True,因为对于 Python,它是表示它不是数字的有效浮点数。例如:
>>> is_number('NaN')
True
为了检查数字是否为“NaN”,您可以使用math.isnan()作为:
>>> import math
>>> nan_num = float('nan')
>>> math.isnan(nan_num)
True
或者如果您不想导入其他库来检查它,那么您可以简单地通过使用== 将其与自身进行比较来检查它。当nan float 与自身进行比较时,Python 返回False。例如:
# `nan_num` variable is taken from above example
>>> nan_num == nan_num
False
因此,上面的函数is_number可以更新为为False返回False:
def is_number(n):
is_number = True
try:
num = float(n)
# check for "nan" floats
is_number = num == num # or use `math.isnan(num)`
except ValueError:
is_number = False
return is_number
示例运行:
>>> is_number('Nan') # not a number "Nan" string
False
>>> is_number('nan') # not a number string "nan" with all lower cased
False
>>> is_number('123') # positive integer
True
>>> is_number('-123') # negative integer
True
>>> is_number('-1.12') # negative `float`
True
>>> is_number('abc') # "some random" string
False
上述函数仍会为complex numbers 返回False。如果您希望 is_number 函数将 复数 视为有效数字,则需要将传递的字符串类型转换为 complex() 而不是 float()。然后你的 is_number 函数将如下所示:
def is_number(n):
is_number = True
try:
# v type-casting the number here as `complex`, instead of `float`
num = complex(n)
is_number = num == num
except ValueError:
is_number = False
return is_number
示例运行:
>>> is_number('1+2j') # Valid
True # : complex number
>>> is_number('1+ 2j') # Invalid
False # : string with space in complex number represetantion
# is treated as invalid complex number
>>> is_number('123') # Valid
True # : positive integer
>>> is_number('-123') # Valid
True # : negative integer
>>> is_number('abc') # Invalid
False # : some random string, not a valid number
>>> is_number('nan') # Invalid
False # : not a number "nan" string
PS:每次检查的每个操作取决于号码的类型,都会带来额外的开销。选择适合您要求的is_number 函数版本。
【讨论】:
is_number 函数一样。
float([1, 2, 3]) 会发生什么?它会提高TypeError exception。但是如果你想压缩所有的错误,你可以把ValueError从try/except中删除,让我的函数压缩所有的异常。
对于长度为 1 的字符串,您可以简单地执行 isdigit() 或 isalpha()
如果你的字符串长度大于 1,你可以做一个类似的函数..
def isinteger(a):
try:
int(a)
return True
except ValueError:
return False
【讨论】: