note.nkmk.me

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

Date: 2018-03-15 / tags: Python, 文字列操作

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

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

  • 数字かどうか判定
    • 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_TypeDigitまたは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_TypeNumericである数字も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
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事