Python确定并检查一个字符串是数字还是字母

商业

Python提供了几个字符串方法来确定和检查一个字符串类型是数字还是字母。

每种方法都有示例代码解释。

  • 判断一个字符串是否为小数位:str.isdecimal()
  • 判断一个字符串是否是一个数字:str.isdigit()
  • 判断一个字符串是否是代表数字的字符:str.isnumeric()
  • 判断字符串是否为英文字母:str.isalpha()
  • 确定字符串是否为字母数字型:str.isalnum()
  • 确定字符串是否为ASCII字符:str.isascii()
  • 对空字符串的判断
  • 判断字符串是否可以转换为数字

对于isascii()以外的方法,包含空字符串、以下符号等的字符串为假。

  • ,
  • .
  • -

-1.23,等等,作为一个数值在本节末尾解释。

正则表达式可以用来更灵活地确定字符类型并提取相关的字符类型。

关于如何确定以下内容的更多信息,请参见以下文章

  • 如何将数字字符串(str)转换为数字(int, float)?
  • 如何确定大写和小写

判断一个字符串是否为小数位: str.isdecimal()

在isdecimal()中,如果所有字符都是十进制数字,即Unicode的一般类别Nd中的字符,则为真。对于全角的阿拉伯数字等也是如此。

s = '1234567890'
print('s =', s)
print('isdecimal:', s.isdecimal())
print('isdigit:', s.isdigit())
print('isnumeric:', s.isnumeric())
# s = 1234567890
# isdecimal: True
# isdigit: True
# isnumeric: True

s = '1234567890'
print('s =', s)
print('isdecimal:', s.isdecimal())
print('isdigit:', s.isdigit())
print('isnumeric:', s.isnumeric())
# s = 1234567890
# isdecimal: True
# isdigit: True
# isnumeric: True

如果它包含一个符号,如减号或句号,它就是假的。例如,如果你想确定像'-1.23'这样的字符串是一个数字值,你可以使用异常处理。这在本节末尾有解释。

s = '-1.23'
print('s =', s)
print('isdecimal:', s.isdecimal())
print('isdigit:', s.isdigit())
print('isnumeric:', s.isnumeric())
# s = -1.23
# isdecimal: False
# isdigit: False
# isnumeric: False

判断一个字符串是否是一个数字: str.isdigit()

在isdigit()中,除了在isdecimal()中为真之外,Unicode属性值Numeric_Type为数字或十进制的数字也为真。

例如,一个代表正方形的上标数字在isdecimal()中是假的,但在isdigit()中是真的。

  • 代表平方的上标数字
    • ²
    • ''u00B2}'
s = '10\u00B2'
print('s =', s)
print('isdecimal:', s.isdecimal())
print('isdigit:', s.isdigit())
print('isnumeric:', s.isnumeric())
# s = 10²
# isdecimal: False
# isdigit: True
# isnumeric: True

判断一个字符串是否是代表数字的字符: str.isnumeric()

在isnumeric()中,除了在isdigit()中为真的数字外,Unicode属性值Numeric_Type为数字的数字也为真。

分数、罗马数字和中国数字也是如此。

s = '\u00BD'
print('s =', s)
print('isdecimal:', s.isdecimal())
print('isdigit:', s.isdigit())
print('isnumeric:', s.isnumeric())
# s = ½
# isdecimal: False
# isdigit: False
# isnumeric: True

s = '\u2166'
print('s =', s)
print('isdecimal:', s.isdecimal())
print('isdigit:', s.isdigit())
print('isnumeric:', s.isnumeric())
# s = Ⅶ
# isdecimal: False
# isdigit: False
# isnumeric: True

s = '一二三四五六七八九〇'
print('s =', s)
print('isdecimal:', s.isdecimal())
print('isdigit:', s.isdigit())
print('isnumeric:', s.isnumeric())
# s = 一二三四五六七八九〇
# isdecimal: False
# isdigit: False
# isnumeric: True

s = '壱億参阡萬'
print('s =', s)
print('isdecimal:', s.isdecimal())
print('isdigit:', s.isdigit())
print('isnumeric:', s.isnumeric())
# s = 壱億参阡萬
# isdecimal: False
# isdigit: False
# isnumeric: True

判断字符串是否为英文字母: str.isalpha()

在isalpha()中,一个Unicode一般类别的属性有以下情况之一的为真。

  • Lm
  • Lt
  • Lu
  • Ll
  • Lo

字母表、汉字等将是真实的。

s = 'abc'
print('s =', s)
print('isalpha:', s.isalpha())
# s = abc
# isalpha: True

s = '漢字'
print('s =', s)
print('isalpha:', s.isalpha())
# s = 漢字
# isalpha: True

阿拉伯数字是假的,但中国数字是真的,因为它们也是汉字;不过,中国数字中的零是假的。

s = '1234567890'
print('s =', s)
print('isalpha:', s.isalpha())
# s = 1234567890
# isalpha: False

s = '1234567890'
print('s =', s)
print('isalpha:', s.isalpha())
# s = 1234567890
# isalpha: False

s = '一二三四五六七八九'
print('s =', s)
print('isalpha:', s.isalpha())
# s = 一二三四五六七八九
# isalpha: True

s = '壱億参阡萬'
print('s =', s)
print('isalpha:', s.isalpha())
# s = 壱億参阡萬
# isalpha: True

s = '〇'
print('s =', s)
print('isalpha:', s.isalpha())
# s = 〇
# isalpha: False

罗马数字是假的。

s = '\u2166'
print('s =', s)
print('isalpha:', s.isalpha())
# s = Ⅶ
# isalpha: False

确定字符串是否为字母数字型: str.isalnum()

在isalnum()中,如果每个字符在迄今为止列出的以下任何方法中都是真的,那么它就是真的。

  • isdecimal()
  • isdigit()
  • isnumeric()
  • isalpha()

每个字符都是单独评估的,所以一个包含字母和数字的字符串在isalnum()中会为真,即使在所有其他方法中为假。

s = 'abc123'
print('s =', s)
print('isalnum:', s.isalnum())
print('isalpha:', s.isalpha())
print('isdecimal:', s.isdecimal())
print('isdigit:', s.isdigit())
print('isnumeric:', s.isnumeric())
# s = abc123
# isalnum: True
# isalpha: False
# isdecimal: False
# isdigit: False
# isnumeric: False

确定字符串是否为ASCII字符: str.isascii()

Python 3.7 增加了 isascii()。如果字符串中的所有字符都是ASCII字符,它将返回true。

除了数字和字母之外,符号如+和-也是如此。

s = 'abc123+-,.&'
print('s =', s)
print('isascii:', s.isascii())
print('isalnum:', s.isalnum())
# s = abc123+-,.&
# isascii: True
# isalnum: False

非ASCII平假名和其他字符是假的。

s = 'あいうえお'
print('s =', s)
print('isascii:', s.isascii())
print('isalnum:', s.isalnum())
# s = あいうえお
# isascii: False
# isalnum: True

接下来我们将看到,与其他方法不同,isascii()即使对空字符串也会返回true。

对空字符串的判断

对于isascii()来说,空字符串为真,对于其他方法来说为假。

s = ''
print('s =', s)
print('isalnum:', s.isalnum())
print('isalpha:', s.isalpha())
print('isdecimal:', s.isdecimal())
print('isdigit:', s.isdigit())
print('isnumeric:', s.isnumeric())
print('isascii:', s.isascii())
# s = 
# isalnum: False
# isalpha: False
# isdecimal: False
# isdigit: False
# isnumeric: False
# isascii: True

使用bool()来确定是否为空字符串。如果是空字符串,其返回值为false,否则为true。

print(bool(''))
# False

print(bool('abc123'))
# True

判断字符串是否可以转换为数字

负数或分数值的字符串包含周期或减号。因此,除了isascii(),所有方法的结果都是假的。

虽然对于isascii()来说是真的,但它不适合用于确定一个字符串是否可以转换为数字值,因为即使它包含其他符号或字母字符,它也是真的。

s = '-1.23'
print('s =', s)
print('isalnum:', s.isalnum())
print('isalpha:', s.isalpha())
print('isdecimal:', s.isdecimal())
print('isdigit:', s.isdigit())
print('isnumeric:', s.isnumeric())
print('isascii:', s.isascii())
# s = -1.23
# isalnum: False
# isalpha: False
# isdecimal: False
# isdigit: False
# isnumeric: False
# isascii: True

字符串可以用float()转换为浮点数。对于不能转换的字符串,会出现错误。

print(float('-1.23'))
# -1.23

print(type(float('-1.23')))
# <class 'float'>

# print(float('abc'))
# ValueError: could not convert string to float: 'abc'

通过异常处理,可以定义一个函数,当一个字符串可以用float()转换时,返回真。

def is_num(s):
    try:
        float(s)
    except ValueError:
        return False
    else:
        return True

print(is_num('123'))
# True

print(is_num('-1.23'))
# True

print(is_num('+1.23e10'))
# True

print(is_num('abc'))
# False

print(is_num('10,000,000'))
# False

如果你想确定一个用逗号分隔的数字也是真的,就用replace()去掉逗号(用一个空字符串代替)。

def is_num_delimiter(s):
    try:
        float(s.replace(',', ''))
    except ValueError:
        return False
    else:
        return True

print(is_num_delimiter('10,000,000'))
# True

如果你想支持空白定界,你可以进一步使用replace()。

def is_num_delimiter2(s):
    try:
        float(s.replace(',', '').replace(' ', ''))
    except ValueError:
        return False
    else:
        return True

print(is_num_delimiter2('10,000,000'))
# True

print(is_num_delimiter2('10 000 000'))
# True
Copied title and URL