Pythonで入力チェックを行う際、文字列が数字か英字か空白かを素早く確実に見分けられると便利です。
本記事では初心者の方にもわかりやすいように、isdigit
、isalpha
、isspace
などの基本メソッドと、ASCII限定や正規表現を使った厳密判定まで、挙動と注意点を例付きで詳しく解説します。
Pythonの文字列判定の基本ルール
メソッドは文字列全体を評価する
str.isdigit
やstr.isalpha
などの判定メソッドは、文字列の全ての文字が条件を満たす場合にのみTrue
を返します。
1文字でも条件に合わなければFalse
です。
# 文字列全体が条件を満たすかどうかを確認します
samples = ['123', '12a3', '123', 'Ⅳ', 'abc', 'abc123']
checks = [
('isdigit', str.isdigit),
('isalpha', str.isalpha),
('isalnum', str.isalnum),
]
for name, fn in checks:
print(f'[{name}]')
for s in samples:
print(f' {s!r:8} -> {fn(s)}')
print()
[isdigit]
'123' -> True
'12a3' -> False
'123' -> True
'Ⅳ' -> False
'abc' -> False
'abc123' -> False
[isalpha]
'123' -> False
'12a3' -> False
'123' -> False
'Ⅳ' -> False
'abc' -> True
'abc123' -> False
[isalnum]
'123' -> True
'12a3' -> True
'123' -> True
'Ⅳ' -> True
'abc' -> True
'abc123' -> True
補足
'Ⅳ'
(ローマ数字4)はisnumeric
がTrue
ですがisdigit
はFalse
です。isalnum
は「英字か数字」ならTrueなのでTrue
になります。'123'
(全角数字)もisdigit
でTrue
です。
空文字はFalseになる
これらのメソッドは「1文字以上あること」が前提です。
空文字は常にFalse
になります。
# 空文字は何の is~ でも False です
targets = ['', ' ', '\t', 'a', '0']
for s in targets:
print(repr(s), 'isdigit:', s.isdigit(), 'isalpha:', s.isalpha(), 'isspace:', s.isspace())
'' isdigit: False isalpha: False isspace: False
' ' isdigit: False isalpha: False isspace: True
'\t' isdigit: False isalpha: False isspace: True
'a' isdigit: False isalpha: True isspace: False
'0' isdigit: True isalpha: False isspace: False
英数字をまとめて判定する isalnum
isalnum
は「英字または数字のみか」を一括で判定できます。
記号や空白が混ざるとFalse
です。
samples = ['abc123', 'abc', '123', '漢字123', 'abc-123', 'Ⅳ', ' ']
for s in samples:
print(f'{s!r:8} -> isalnum: {s.isalnum()}')
'abc123' -> isalnum: True
'abc' -> isalnum: True
'123' -> isalnum: True
'漢字123' -> isalnum: True
'abc-123'-> isalnum: False
'Ⅳ' -> isalnum: True
' ' -> isalnum: False
ASCIIのみを判定する isascii
isascii
は「ASCII(0〜127)だけで構成されているか」を調べます。
英数字のASCII限定チェックは、isalnum
とisascii
を組み合わせます。
samples = ['abc', 'abc', '123', '123', ' ', ' ']
for s in samples:
print(f'{s!r:6} -> isascii: {s.isascii()}')
'abc' -> isascii: True
'abc' -> isascii: False
'123' -> isascii: True
'123' -> isascii: False
' ' -> isascii: True
' ' -> isascii: False
- ASCII英数字のみか確認するには、
s.isalnum() and s.isascii()
を使います。 isascii
はPython 3.7以降で利用できます。
数字の判定: isdigit isdecimal isnumeric の違い
Pythonの数字判定は3種類あり、包含関係は概ねisdecimal ⊆ isdigit ⊆ isnumeric
です。
違いを理解すると誤判定を避けられます。
半角10進の数字を判定する isdecimal
isdecimal
は「10進数字(Unicodeのdecimal数字)のみ」で構成されるかを判定します。
ASCIIの'0'〜'9'
に限らず、全角数字や他の言語の10進数字(アラビア数字など)も含みます。
samples = ['123', '123', '٣٤٥', '²'] # '٣٤٥' はアラビア・インド数字、'²' は上付き2
for s in samples:
print(f"{s!r:6} isdecimal -> {s.isdecimal()}")
'123' isdecimal -> True
'123' isdecimal -> True
'٣٤٥' isdecimal -> True
'²' isdecimal -> False
全角や上付きの数字を判定する isdigit
isdigit
はisdecimal
に加えて、上付き/下付きの数字など「数字として扱われる文字」もTrueになります。
samples = ['123', '123', '²', '³', '④']
for s in samples:
print(f"{s!r:4} isdigit -> {s.isdigit()}")
'123' isdigit -> True
'123' isdigit -> True
'²' isdigit -> True
'³' isdigit -> True
'④' isdigit -> True
'④'
(囲み数字4)は環境によってisdigit
がTrue
になる代表例です。- 一方、ローマ数字の
'Ⅳ'
はisdigit
ではFalse
です(次のisnumeric
でTrue
)。
漢数字や分数を判定する isnumeric
isnumeric
は、漢数字やローマ数字、分数など「数値として解釈可能な文字」まで対象を広げます。
samples = ['四', 'Ⅳ', '½', '⅔', '②'] # '②' は isdigit も True になりうる
for s in samples:
print(f"{s!r:2} -> isdecimal:{s.isdecimal():5} isdigit:{s.isdigit():5} isnumeric:{s.isnumeric():5}")
'四' -> isdecimal:False isdigit:False isnumeric: True
'Ⅳ' -> isdecimal:False isdigit:False isnumeric: True
'½' -> isdecimal:False isdigit:False isnumeric: True
'⅔' -> isdecimal:False isdigit:False isnumeric: True
'②' -> isdecimal:False isdigit: True isnumeric: True
符号や小数点は数字ではない
'-3'
や'3.14'
、'1e3'
、'3,000'
などは、いずれのisdecimal
/isdigit
/isnumeric
でもFalse
です。
これらは「数値表記として妥当か」を検証する問題であり、次のようにint
/float
/decimal.Decimal
でパースするのが実用的です。
# 数値表記として妥当か(符号・小数点・指数表記などを許す)を調べる例
def is_number_like(s: str) -> bool:
try:
float(s) # 'NaN' や 'inf' も通る点に注意。厳密にしたい場合は Decimal を検討。
return True
except ValueError:
return False
tests = ['-3', '3.14', '1e3', '3,000', 'Ⅳ', '四']
for t in tests:
print(f'{t!r:6} isdecimal:{t.isdecimal():5} isdigit:{t.isdigit():5} isnumeric:{t.isnumeric():5} number_like:{is_number_like(t)}')
'-3' isdecimal:False isdigit:False isnumeric:False number_like:True
'3.14' isdecimal:False isdigit:False isnumeric:False number_like:True
'1e3' isdecimal:False isdigit:False isnumeric:False number_like:True
'3,000'isdecimal:False isdigit:False isnumeric:False number_like:False
'Ⅳ' isdecimal:False isdigit:False isnumeric: True number_like:False
'四' isdecimal:False isdigit:False isnumeric: True number_like:False
参考: 代表的な文字と結果の早見表
入力 | 説明 | isdecimal | isdigit | isnumeric |
---|---|---|---|---|
123 | ASCII数字 | True | True | True |
123 | 全角数字 | True | True | True |
٣٤٥ | アラビア・インド数字 | True | True | True |
² | 上付き2 | False | True | True |
Ⅳ | ローマ数字4 | False | False | True |
四 | 漢数字4 | False | False | True |
½ | 2分の1 | False | False | True |
-3 | 符号付き | False | False | False |
3.14 | 小数点あり | False | False | False |
英字の判定 isalpha と ASCII 限定
英字のみを判定する isalpha
isalpha
は、Unicodeの「文字(アルファベット)」を対象にします。
ラテン文字以外(ひらがなやギリシャ文字など)もTrue
です。
samples = ['abc', 'Abc', 'é', 'Ω', 'あ', 'abc123', '']
for s in samples:
print(f"{s!r:7} -> isalpha: {s.isalpha()}")
'abc' -> isalpha: True
'Abc' -> isalpha: True
'é' -> isalpha: True
'Ω' -> isalpha: True
'あ' -> isalpha: True
'abc123' -> isalpha: False
'' -> isalpha: False
ASCII英字に限定する isalpha と isascii の併用
ASCIIのA〜Z・a〜zだけに限定したい場合は、s.isalpha() and s.isascii()
で判定します。
samples = ['abc', 'AbC', 'Ångström', 'abc', 'Ω', 'あ']
for s in samples:
ascii_alpha = s.isalpha() and s.isascii()
print(f"{s!r:10} isalpha:{s.isalpha():5} isascii:{s.isascii():5} ASCII alpha only:{ascii_alpha}")
'abc' isalpha: True isascii: True ASCII alpha only:True
'AbC' isalpha: True isascii: True ASCII alpha only:True
'Ångström' isalpha: True isascii: False ASCII alpha only:False
'abc' isalpha: True isascii: False ASCII alpha only:False
'Ω' isalpha: True isascii: False ASCII alpha only:False
'あ' isalpha: True isascii: False ASCII alpha only:False
AからZのみを正規表現で厳密判定
大文字A〜Zのみ(小文字不可、Unicode不可)といった厳密条件は正規表現が簡潔です。
import re
pattern = re.compile(r'[A-Z]+') # ASCII大文字のみ(1文字以上)
tests = ['ABC', 'AbC', 'ABC', 'XYZ', 'abc', '']
for s in tests:
matched = bool(pattern.fullmatch(s)) # 文字列全体がマッチするか
print(f"{s!r:6} -> A-Z only: {matched}")
'ABC' -> A-Z only: True
'AbC' -> A-Z only: False
'ABC' -> A-Z only: False
'XYZ' -> A-Z only: True
'abc' -> A-Z only: False
'' -> A-Z only: False
- 大文字小文字を区別せずASCII英字のみ許可したい場合は、
re.fullmatch(r'[a-z]+', s, flags=re.IGNORECASE)
とします(この書き方なら全角やアクセント付き文字は入りません)。
空白の判定 isspace
スペース タブ 改行などを判定する isspace
isspace
は、スペースやタブ、改行などの空白文字のみで構成されているかを判定します。
samples = [' ', '\t', '\n', '\v', '\f', ' \t\n', 'a', ' a ', '']
for s in samples:
print(f"{s.encode():10} -> isspace: {s.isspace()}")
b' ' -> isspace: True
b'\t' -> isspace: True
b'\n' -> isspace: True
b'\x0b' -> isspace: True
b'\x0c' -> isspace: True
b' \t\n' -> isspace: True
b'a' -> isspace: False
b' a ' -> isspace: False
b'' -> isspace: False
- 1文字でも空白以外が含まれると
False
です。 - 空文字は
False
です。
半角スペースと全角スペースの扱い
isspace
は全角スペース(IDEOGRAPHIC SPACE、' '
)もTrue
になります。
一方で、ASCII限定のisascii
はFalse
です。
half = ' ' # 半角スペース
full = ' ' # 全角スペース(IDEOGRAPHIC SPACE)
print('half:', half.isspace(), half.isascii())
print('full:', full.isspace(), full.isascii())
half: True True
full: True False
- ノーブレークスペース(NBSP、
'\u00A0'
)も多くの環境でisspace()
はTrue
になります。 - ゼロ幅スペース(
'\u200B'
)は「空白」ではない扱いのためisspace()
はFalse
です。
文字列に空白が含まれるかを調べる
「空白のみ」ではなく「空白を1つでも含むか」を調べたいときは、any(c.isspace() for c in s)
や正規表現を使います。
' '
(半角スペース)のin
検索では全角スペースなどを見逃す点に注意します。
import re
def contains_whitespace_any(s: str) -> bool:
# 文字ごとに isspace を見る(Unicodeの空白全般を検出)
return any(ch.isspace() for ch in s)
def contains_whitespace_re(s: str) -> bool:
# \s は Unicode 空白を含む
return bool(re.search(r'\s', s))
tests = ['foo bar', 'foo bar', 'foobar', '']
for t in tests:
print(
f"{t!r:10} -> any: {contains_whitespace_any(t):5}, regex: {contains_whitespace_re(t):5}, ' ' in s: {' ' in t}"
)
'foo bar' -> any: True , regex: True , ' ' in s: True
'foo bar' -> any: True , regex: True , ' ' in s: False
'foobar' -> any: False, regex: False, ' ' in s: False
'' -> any: False, regex: False, ' ' in s: False
まとめ
- 文字列判定メソッドは「文字列全体」を評価し、空文字は常に
False
です。 - 数字判定は用途別に使い分けます。10進数字のみなら
isdecimal
、上付きなども許容するならisdigit
、漢数字や分数・ローマ数字まで含めるならisnumeric
です。符号や小数点・カンマ付きはこれらではTrue
にならないため、数値として受け付けたい場合はint
/float
/decimal
でのパースを使います。 - 英字判定は
isalpha
がUnicode全体を対象にします。ASCII英字に限定するならisalpha and isascii
、さらに厳密にA〜Zのみなどは正規表現で判定します。 - 空白判定の
isspace
はタブ・改行・全角スペースも含む幅広い空白をTrue
にします。「空白を含むか」の検出にはany(ch.isspace() for ch in s)
や正規表現の\s
が有効です。
これらの基本を押さえることで、入力バリデーションや前処理を安全かつ簡潔に実装できるようになります。
用途と文字集合に応じて、最適なメソッドや組み合わせを選んでください。