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