Pythonで文字列が数字か英字か英数字か判定・確認

Pythonでは、文字列str型が数字か英字か英数字かを判定し確認するための文字列メソッドがいくつか用意されています。

  1. 組み込み型 文字列メソッド — Python 3.6.4 ドキュメント

ざっくりまとめると以下の通り。

数字かどうか判定 str.isdecimal(): 全ての文字が十進数字なら真、そうでなければ偽 半角・全角のアラビア数字が真 str.isdigit(): 全ての文字が数字なら真、そうでなければ偽 半角・全角のアラビア数字、特殊数字が真 str.isnumeric(): 全ての文字が数を表す文字なら真、そうでなければ偽 半角・全角のアラビア数字、特殊数字、漢数字が真 英字かどうか判定 str.isalpha(): 全ての文字が英字なら真、そうでなければ偽 便宜上「英字」と書いているが、平仮名やカタカナ、漢字なども真 英数字かどうか判定 str.isalnum(): 全ての文字が英数字なら真、そうでなければ偽 各文字が上のメソッドで真となれば真

それぞれのメソッドについてサンプルコードとともに説明します。 空文字列、記号(,, ., -など)を含んだ文字列は上で挙げたすべてのメソッドで偽となってしまいます。-1.23などを数値として判定する方法を最後に説明します。 判定ではなく、数字の文字列strを数値int, floatに変換する方法は

また、数字と英字の判定ではなく大文字と小文字を判定したい場合は

str.isdecimal(): 全ての文字が十進数字なら真

十進数字、つまり、Unicodeの一般カテゴリNdに含まれる文字がTrueとなります。全角のアラビア数字も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

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

str.isdigit(): 全ての文字が数字なら真

str.isdecimal()でTrueとなる数字に加え、Unicodeのプロパティ値Numeric_TypeがDigitまたはDecimalである数字もTrueとなります。 例えば、2乗を表す上付き数字'\u00B2'はstr.isdecimal()ではFalseだが、isdigit()ではTrue。

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

str.isnumeric(): 全ての文字が数を表す文字なら真

str.isdigit()でTrueとなる数字に加え、Unicodeのプロパティ値Numeric_TypeがNumericである数字もTrueとなります。 str.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(): 全ての文字が英字なら真

Unicode文字データベースでLetterとして定義されているもの、つまり、Unicodeの一般カテゴリプロパティがLm, Lt, Lu, Ll, LoのいずれかをもつものがTrueとなります。 アルファベットや平仮名、カタカナ、漢字などが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

str.isalnum(): 全ての文字が英数字なら真

各文字がここまで挙げたメソッドのいずれかでTrueとなればTrue。 各文字それぞれに対して評価するので、英字と数字を含む文字列はほかのメソッドすべてでFalseとなってもstr.isalnum()ではTrueとなります。

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

空文字列は偽 空の文字列はすべてのメソッドで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())
# s =
# isalnum: False
# isalpha: False
# isdecimal: False
# isdigit: False
# isnumeric: False

記号(カンマ、ピリオド、マイナスなど)が入っている文字列は偽 カンマ,、ピリオド.、マイナス-などの記号が入っている文字列は、すべてのメソッドでFalseとなります。

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

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

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

カンマ区切りの文字列や小数、負の数値などもTrueと判定したい場合は、以下のような関数が考えられます。 シンプルに、カンマ,、ピリオド.、マイナス-をreplace()メソッドで削除(空文字列に置換)したあとでisnumeric()メソッドを適用します。

def is_num(s):
    return s.replace(',', '').replace('.', '').replace('-', '').isnumeric()

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

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

print(is_num('128.0.0.0'))
# True

同じ記号を複数回含む'128.0.0.0'はFalseとしたい場合、float()関数で数値に変換できる文字列のみTrueを返す以下のような関数が考えられます。 この関数ではeを含む指数表記の文字列もTrueとなるが、,区切り文字列はFalseとなります。 最終的に数値に変換するのであればこちらのほうが適当かもしれない。

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

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

print(is_num2('128.0.0.0'))
# False

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

print(is_num2('1.23e10'))
# True
Last Updated: 6/26/2019, 10:34:03 PM