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

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

## 目次

1.  [文字列が十進数字か判定: `str.isdecimal()`](#文字列が十進数字か判定-strisdecimal)
2.  [文字列が数字か判定: `str.isdigit()`](#文字列が数字か判定-strisdigit)
3.  [文字列が数を表す文字か判定: `str.isnumeric()`](#文字列が数を表す文字か判定-strisnumeric)
4.  [文字列が英字か判定: `str.isalpha()`](#文字列が英字か判定-strisalpha)
5.  [文字列が英数字か判定: `str.isalnum()`](#文字列が英数字か判定-strisalnum)
6.  [文字列がASCII文字か判定: `str.isascii()`](#文字列がascii文字か判定-strisascii)
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 ドキュメント](https://docs.python.org/ja/3/library/stdtypes.html#str.isdecimal)

```python
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 = '１２３４５６７８９０'
print('s =', s)
print('isdecimal:', s.isdecimal())
print('isdigit:', s.isdigit())
print('isnumeric:', s.isnumeric())
# s = １２３４５６７８９０
# isdecimal: True
# isdigit: True
# isnumeric: True
```

`-` や `.` などの記号を含むと `False` となります。例えば `'-1.23'` のような文字列を数値と判定したい場合は例外処理を用いる方法があります。最後に説明します。

```python
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` となります。

[組み込み型 - str.isdigit() — Python 3.11.3 ドキュメント](https://docs.python.org/ja/3/library/stdtypes.html#str.isdigit)

例えば、2乗を表す上付き数字 `²` (`\u00B2`) は `isdecimal()` では `False` ですが、`isdigit()` では `True` です。

```python
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` となります。

[組み込み型 - str.isnumeric() — Python 3.11.3 ドキュメント](https://docs.python.org/ja/3/library/stdtypes.html#str.isnumeric)

分数やローマ数字、漢数字なども `True` となります。

```python
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 ドキュメント](https://docs.python.org/ja/3/library/stdtypes.html#str.isalpha)

アルファベットや平仮名、カタカナ、漢字などが `True` となります。

```python
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`。

```python
s = '1234567890'
print('s =', s)
print('isalpha:', s.isalpha())
# s = 1234567890
# isalpha: False

s = '１２３４５６７８９０'
print('s =', s)
print('isalpha:', s.isalpha())
# s = １２３４５６７８９０
# 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`。

```python
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 ドキュメント](https://docs.python.org/ja/3/library/stdtypes.html#str.isalnum)

各文字それぞれに対して評価するので、英字と数字を含む文字列はほかのメソッドすべてで `False` となっても `isalnum()` では `True` となります。

```python
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 ドキュメント](https://docs.python.org/ja/3/library/stdtypes.html#str.isascii)
[ASCII - Wikipedia](https://ja.wikipedia.org/wiki/ASCII)

数字やアルファベットに加え、`+` や `-` などの記号も `True` となります。

```python
s = 'abc123+-,.&'
print('s =', s)
print('isascii:', s.isascii())
print('isalnum:', s.isalnum())
# s = abc123+-,.&
# isascii: True
# isalnum: False
```

ASCII文字ではない平仮名などは `False`。

```python
s = 'あいうえお'
print('s =', s)
print('isascii:', s.isascii())
print('isalnum:', s.isalnum())
# s = あいうえお
# isascii: False
# isalnum: True
```

次に紹介するように、他のメソッドと異なり、`isascii()` は空文字に対しても `True` を返します。

## 空文字列の判定

空文字列 `''` は、`isascii()` では `True`、そのほかのメソッドでは `False` となります。

```python
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）と他の型との変換・判定]([ここに記事へのリンクを入れる])

```python
print(bool(''))
# False

print(bool('abc123'))
# True
```

## 文字列が数値に変換できるか判定

負の値あるいは小数の値の文字列にはピリオド `.` やマイナス `-` が入っているため、`isascii()` 以外のメソッドでは `False` となります。

`isascii()` では `True` となりますが、その他の記号やアルファベットが含まれていても `True` となるため、数値に変換できる文字列かどうかの判定には向かないです。

```python
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` に変換できます。変換できない文字列に対してはエラーが発生します。

[関連記事: Pythonで数字の文字列strを数値int, floatに変換]([ここに記事へのリンクを入れる])

```python
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）]([ここに記事へのリンクを入れる])

```python
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）]([ここに記事へのリンクを入れる])

```python
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()` を使えばよいでしょう。

```python
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
```