检测Python字符串是数字还是字母[重复]

Posted

技术标签:

【中文标题】检测Python字符串是数字还是字母[重复]【英文标题】:Detect whether a Python string is a number or a letter [duplicate] 【发布时间】:2017-02-27 02:21:57 【问题描述】:

如何检测字符串中的数字或字母?我知道您使用 ASCII 码,但哪些功能可以利用它们?

【问题讨论】:

见this list,尤其是str.isdigit()str.isalpha() 解决方案:***.com/a/64132078/8321339 【参考方案1】:

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

您可以使用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”(不是数字)字符串

上述函数将为“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

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

上述函数仍会为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 函数版本。

【讨论】:

这是一个非常完整且描述良好的答案。 +1 很好的答案,但不处理 TypeError 异常。就像您将列表传递给 is_number 函数一样。 @Amin 这是设计使然。函数不应隐式压缩异常。例如,如果您执行 float([1, 2, 3]) 会发生什么?它会提高TypeError exception。但是如果你想压缩所有的错误,你可以把ValueErrortry/except中删除,让我的函数压缩所有的异常。【参考方案2】:

对于长度为 1 的字符串,您可以简单地执行 isdigit()isalpha()

如果你的字符串长度大于 1,你可以做一个类似的函数..

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

【讨论】:

以上是关于检测Python字符串是数字还是字母[重复]的主要内容,如果未能解决你的问题,请参考以下文章

检查字符串中的一个字符是数字还是字母[Python] [关闭]

python基础

Python-如何使用 re 匹配整个字符串 [重复]

1python基础语法

1python基础语法

python学习日记1-基础