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

Modified: | Tags: Python, 文字列

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

isascii()以外のメソッドでは、空文字列や記号(,, ., -など)を含んだ文字列は偽となる。-1.23などを数値として判定する方法を最後に説明する。

正規表現を使うとより柔軟に文字種を判定したり、該当の文字種を抽出したりできる。以下の記事を参照。

数字の文字列strを数値int, floatに変換する方法や、数字と英字の判定ではなく大文字と小文字を判定する方法については以下の記事を参照。

文字列が十進数字か判定: str.isdecimal()

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

-.などの記号を含むと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_TypeDigitまたはDecimalである数字もTrueとなる。

例えば、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_TypeNumericである数字もTrueとなる。

分数やローマ数字、漢数字なども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となる。

アルファベットや平仮名、カタカナ、漢字などが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となる。

各文字それぞれに対して評価するので、英字と数字を含む文字列はほかのメソッドすべてで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を返す。

数字やアルファベットに加え、+-などの記号も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となる。

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

文字列strfloat()で浮動小数点数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

カンマ区切りの数値もTrueと判定したい場合は、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

数値が整数かどうかを判定したい場合は以下の記事を参照。

関連カテゴリー

関連記事