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_Type
がDigit
または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_Type
がNumeric
である数字も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
文字列str
はfloat()
で浮動小数点数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
数値が整数かどうかを判定したい場合は以下の記事を参照。
- 関連記事: Pythonで数値が整数か小数かを判定