Pythonでは、文字列 str
型が数字か英字か英数字かを判定し確認するための文字列メソッドがいくつか用意されています。備忘録としてここに残します
目次
- 文字列が十進数字か判定:
str.isdecimal()
- 文字列が数字か判定:
str.isdigit()
- 文字列が数を表す文字か判定:
str.isnumeric()
- 文字列が英字か判定:
str.isalpha()
- 文字列が英数字か判定:
str.isalnum()
- 文字列がASCII文字か判定:
str.isascii()
- 空文字列の判定
- 文字列が数値に変換できるか判定
isascii()
以外のメソッドでは、空文字列や記号(,
, .
, -
など)を含んだ文字列は False
となります。-1.23
などを数値として判定する方法を最後に説明します。
正規表現を使うとより柔軟に文字種を判定したり、該当の文字種を抽出したりできます。以下の記事を参照。
関連記事: Pythonの正規表現で漢字・ひらがな・カタカナ・英数字を判定・抽出・カウント
数字の文字列 str
を数値 int
, float
に変換する方法や、数字と英字の判定ではなく大文字と小文字を判定する方法については以下の記事を参照。
関連記事: Pythonで数字の文字列strを数値int, floatに変換
関連記事: Pythonで大文字・小文字を操作する文字列メソッド一覧
文字列が十進数字か判定: str.isdecimal()
isdecimal()
では、すべての文字が十進数字つまりUnicodeの一般カテゴリ Nd
に含まれる文字だと True
となります。全角のアラビア数字なども True
です。
組み込み型 - str.isdecimal() — Python 3.11.3 ドキュメント
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
-
や .
などの記号を含むと False
となります。例えば '-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()
で True
となる数字に加え、Unicodeのプロパティ値 Numeric_Type
が Digit
または Decimal
である数字も True
となります。
組み込み型 - str.isdigit() — Python 3.11.3 ドキュメント
例えば、2乗を表す上付き数字 ²
(\u00B2
) は isdecimal()
では False
ですが、isdigit()
では True
です。
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()
で True
となる数字に加え、Unicodeのプロパティ値 Numeric_Type
が Numeric
である数字も True
となります。
組み込み型 - str.isnumeric() — Python 3.11.3 ドキュメント
分数やローマ数字、漢数字なども True
となります。
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文字データベースで Letter
として定義されているもの、つまり、Unicodeの一般カテゴリプロパティが Lm
, Lt
, Lu
, Ll
, Lo
のいずれかをもつものが True
となります。
組み込み型 - str.isalpha() — Python 3.11.3 ドキュメント
アルファベットや平仮名、カタカナ、漢字などが True
となります。
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 = 'アイウエオ'
print('s =', s)
print('isalpha:', s.isalpha())
# s = アイウエオ
# isalpha: True
s = '漢字'
print('s =', s)
print('isalpha:', s.isalpha())
# s = 漢字
# isalpha: True
アラビア数字は False
ですが、漢数字は漢字でもあるので True
。漢数字のゼロ 〇
は False
。
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
ローマ数字は False
。
s = '\u2166'
print('s =', s)
print('isalpha:', s.isalpha())
# s = Ⅶ
# isalpha: False
文字列が英数字か判定: str.isalnum()
isalnum()
では、各文字がここまで挙げたメソッド、isdecimal()
, isdigit()
, isnumeric()
isalpha()
のいずれかで True
となれば True
となります。
組み込み型 - str.isalnum() — Python 3.11.3 ドキュメント
各文字それぞれに対して評価するので、英字と数字を含む文字列はほかのメソッドすべてで False
となっても isalnum()
では True
となります。
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()
Python3.7で isascii()
が追加されました。文字列のすべての文字がASCII文字(U+0000 - U+007F)だと True
を返します。
組み込み型 - str.isascii() — Python 3.11.3 ドキュメント
ASCII - Wikipedia
数字やアルファベットに加え、+
や -
などの記号も True
となります。
s = 'abc123+-,.&'
print('s =', s)
print('isascii:', s.isascii())
print('isalnum:', s.isalnum())
# s = abc123+-,.&
# isascii: True
# isalnum: False
ASCII文字ではない平仮名などは False
。
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
となります。
関連記事: Pythonの真偽値bool型(True, False)と他の型との変換・判定
print(bool(''))
# False
print(bool('abc123'))
# True
文字列が数値に変換できるか判定
負の値あるいは小数の値の文字列にはピリオド .
やマイナス -
が入っているため、isascii()
以外のメソッドでは False
となります。
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
文字列 str
は float()
で浮動小数点数 float
に変換できます。変換できない文字列に対してはエラーが発生します。
関連記事: Pythonで数字の文字列strを数値int, 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
を返す関数を定義できます。
関連記事: Pythonの例外処理(try, except, else, finally)
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
カンマ区切りの数値も True
と判定したい場合は、replace()
を使って ,
を削除します(空文字列 ''
に置換します)。
関連記事: Pythonで文字列を置換(replace, translate, re.sub, re.subn)
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