閉じる

Pythonで文字列が数字/英字/空白か判定する方法まとめ

Pythonで入力チェックを行う際、文字列が数字か英字か空白かを素早く確実に見分けられると便利です。

本記事では初心者の方にもわかりやすいように、isdigitisalphaisspaceなどの基本メソッドと、ASCII限定や正規表現を使った厳密判定まで、挙動と注意点を例付きで詳しく解説します。

Pythonの文字列判定の基本ルール

メソッドは文字列全体を評価する

str.isdigitstr.isalphaなどの判定メソッドは、文字列の全ての文字が条件を満たす場合にのみTrueを返します。

1文字でも条件に合わなければFalseです。

Python
# 文字列全体が条件を満たすかどうかを確認します
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)はisnumericTrueですがisdigitFalseです。isalnumは「英字か数字」ならTrueなのでTrueになります。
  • '123'(全角数字)もisdigitTrueです。

空文字はFalseになる

これらのメソッドは「1文字以上あること」が前提です。

空文字は常にFalseになります。

Python
# 空文字は何の 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です。

Python
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限定チェックは、isalnumisasciiを組み合わせます。

Python
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進数字(アラビア数字など)も含みます。

Python
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

isdigitisdecimalに加えて、上付き/下付きの数字など「数字として扱われる文字」もTrueになります。

Python
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)は環境によってisdigitTrueになる代表例です。
  • 一方、ローマ数字の 'Ⅳ'isdigitではFalseです(次のisnumericTrue)。

漢数字や分数を判定する isnumeric

isnumericは、漢数字やローマ数字、分数など「数値として解釈可能な文字」まで対象を広げます。

Python
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でパースするのが実用的です。

Python
# 数値表記として妥当か(符号・小数点・指数表記などを許す)を調べる例
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

参考: 代表的な文字と結果の早見表

入力説明isdecimalisdigitisnumeric
123ASCII数字TrueTrueTrue
123全角数字TrueTrueTrue
٣٤٥アラビア・インド数字TrueTrueTrue
²上付き2FalseTrueTrue
ローマ数字4FalseFalseTrue
漢数字4FalseFalseTrue
½2分の1FalseFalseTrue
-3符号付きFalseFalseFalse
3.14小数点ありFalseFalseFalse

英字の判定 isalpha と ASCII 限定

英字のみを判定する isalpha

isalphaは、Unicodeの「文字(アルファベット)」を対象にします。

ラテン文字以外(ひらがなやギリシャ文字など)もTrueです。

Python
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()で判定します。

Python
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不可)といった厳密条件は正規表現が簡潔です。

Python
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は、スペースやタブ、改行などの空白文字のみで構成されているかを判定します。

Python
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限定のisasciiFalseです。

Python
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検索では全角スペースなどを見逃す点に注意します。

Python
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が有効です。

これらの基本を押さえることで、入力バリデーションや前処理を安全かつ簡潔に実装できるようになります。

用途と文字集合に応じて、最適なメソッドや組み合わせを選んでください。

この記事を書いた人
エーテリア編集部
エーテリア編集部

人気のPythonを初めて学ぶ方向けに、文法の基本から小さな自動化まで、実際に手を動かして理解できる記事を書いています。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!