0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

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

目次

  1. 文字列が十進数字か判定: str.isdecimal()
  2. 文字列が数字か判定: str.isdigit()
  3. 文字列が数を表す文字か判定: str.isnumeric()
  4. 文字列が英字か判定: str.isalpha()
  5. 文字列が英数字か判定: str.isalnum()
  6. 文字列がASCII文字か判定: str.isascii()
  7. 空文字列の判定
  8. 文字列が数値に変換できるか判定

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_TypeDigit または 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_TypeNumeric である数字も 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

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?