Python 確定並檢查字符串是數字還是字母

商業

Python 提供了幾種字符串方法來確定和檢查字符串類型是數字還是字母。

每種方法都用示例代碼進行了解釋。

  • 確定字符串是否為十進制數字:str.isdecimal()
  • 判斷字符串是否為數字:str.isdigit()
  • 確定字符串是否是表示數字的字符:str.isnumeric()
  • 確定字符串是否為字母:str.isalpha()
  • 確定字符串是否為字母數字:str.isalnum()
  • 確定字符串是否為 ASCII 字符:str.isascii()
  • 空字符串的判斷
  • 確定字符串是否可以轉換為數字

對於 isascii() 以外的方法,包含空字符串、以下符號等的字符串為 false。

  • ,
  • .
  • -

-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 為 Digit 或 Decimal 的數字也為真。

例如,表示正方形的上標數字在 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 為 Numeric 的數字也為真。

分數、羅馬數字和中國數字也是如此。

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() 中將為 true,即使在所有其他方法中為 false。

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() 為 true,對於其他方法為 false。

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() 為 true,但它不適用於確定字符串是否可以轉換為數值,因為即使它包含其他符號或字母字符也為 true。

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() 轉換字符串時返回 true。

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