检测一个Python字符串是数字还是字母

83

我怎样可以检测一个字符串中的数字或字母?我知道可以使用ASCII码,但是哪些函数可以利用它们呢?


7
请参考这个列表,特别是str.isdigit()str.isalpha() - Ken Y-N
解决方案:https://stackoverflow.com/a/64132078/8321339 - Vishal Gupta
2个回答

161

检查字符串是否为非负整数和字母

您可以使用 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

如果您想要同时检查负整数和{link1: float},那么可以编写一个自定义函数进行检查,如下所示:

如果您想要同时检查负数整数和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,对于"NAN"(非数字)字符串因为对于Python来说它是一个有效的浮点数,表示它不是一个数字。例如:

>>> is_number('NaN')
True

为了检查一个数字是否为“NaN”,您可以使用 math.isnan(),如下所示:
>>> import math
>>> nan_num = float('nan')

>>> math.isnan(nan_num)
True

如果您不想导入其他库来检查此内容,则可以通过使用 == 将其与自身进行比较来检查它。当 nan 浮点数与自身进行比较时,Python会返回 False 。例如:

# `nan_num` variable is taken from above example
>>> nan_num == nan_num
False

因此,上述的is_number函数可以更新为以下代码,以便在输入"NaN"时返回Falseis_number
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

允许像"1+2j"这样的复数被视为有效数字

上述函数仍会对复数返回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 函数版本。


4
这是一个非常完整和描述详细的答案。+1 - bballdave025
回答不错,但没有处理 TypeError 异常。比如当你将一个列表传递给 is_number 函数时。 - Amin
@Amin 这是有意为之的设计。函数不应该在隐式中压缩异常。例如,如果你执行float([1, 2, 3])会发生什么呢?它将会触发TypeError异常。但是,如果你想要压缩所有的错误,你可以从try/except中删除ValueError来使我的函数压缩所有异常。 - Moinuddin Quadri

3

对于长度为1的字符串,您可以简单地使用 isdigit() 或者 isalpha() 函数。

如果您的字符串长度大于1,则可以编写一个类似以下的函数..

def isinteger(a):
    try:
        int(a)
        return True
    except ValueError:
        return False

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接