[解決!Python]文字列が数値へ変換可能かどうかを判定するには(int/float関数の例外、re.fullmatch関数)解決!Python

文字列の値を数値に変換する前に、それが変換できるかを調べる必要がある。例外を使ってこれを調べる方法と正規表現を使う方法の2つを紹介する。

» 2021年02月09日 05時00分 公開
[かわさきしんじDeep Insider編集部]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「解決!Python」のインデックス

連載目次

# 文字列が数値を表し、int/float関数による変換が可能かどうかを判定
def isint(s):  # 整数値を表しているかどうかを判定
    try:
        int(s, 10# 文字列を実際にint関数で変換してみる
    except ValueError:
        return False
    else:
        return True

def isfloat(s):  # 浮動小数点数値を表しているかどうかを判定
    try:
        float(s)  # 文字列を実際にfloat関数で変換してみる
    except ValueError:
        return False
    else:
        return True

s1 = '123'
s2 = '123b'
r1 = isint(s1)
r2 = isint(s2)
print(f'{s1}: {r1}, {s2}: {r2}'# 123: True, 123b: False

s1 = '1.23e-1'
s2 = '1.23e'
r1 = isfloat(s1)
r2 = isfloat(s2)
print(f'{s1}: {r1}, {s2}: {r2}'# 1.23e-1: True, 1.23e: False

# 正規表現を使う
import re

def isint2(s):  # 正規表現を使って判定を行う
    p = '[-+]?\d+'
    return True if re.fullmatch(p, s) else False

def isfloat2(s):  # 正規表現を使って判定を行う
    p = '[-+]?(\d+\.?\d*|\.\d+)([eE][-+]?\d+)?'
    return True if re.fullmatch(p, s) else False

s1 = '123'
s2 = '123b'
r1 = isint2(s1)
r2 = isint2(s2)
print(f'{s1}: {r1}, {s2}: {r2}'# 123: True, 123b: False

s1 = '1.23e-1'
s2 = '1.23e'
r1 = isfloat2(s1)
r2 = isfloat2(s2)
print(f'{s1}: {r1}, {s2}: {r2}'# 1.23e-1: True, 1.23e: False


文字列が数値へ変換が可能かどうかを判定する

 input関数で入力された文字列を数値に変換するなど、文字列を数値に変換しなければならないことはよくある。ただし、その際には文字列が数値に変換可能かどうかを前もって調べる必要もある。

 文字列を数値に変換可能かどうかを調べるには、実際にint関数やfloat関数にその文字列を渡してみるのが簡単だ。例外が発生すれば変換できず、そうでなければ変換できる。このことを利用して、次のようにisint関数やisfloat関数を定義できるだろう。

def isint(s):  # 整数値を表しているかどうかを判定
    try:
        int(s, 10# 文字列を実際にint関数で変換してみる
    except ValueError:
        return False  # 例外が発生=変換できないのでFalseを返す
    else:
        return True  # 変換できたのでTrueを返す

def isfloat(s):  # 浮動小数点数値を表しているかどうかを判定
    try:
        float(s)  # 文字列を実際にfloat関数で変換してみる
    except ValueError:
        return False  # 例外が発生=変換できないのでFalseを返す
    else:
        return True  # 変換できたのでTrueを返す


 使用例を以下に示す。

s1 = '123'
s2 = '123b'
r1 = isint(s1)
r2 = isint(s2)
print(f'{s1}: {r1}, {s2}: {r2}'# 123: True, 123b: False

s1 = '1.23e-1'
s2 = '1.23e'
r1 = isfloat(s1)
r2 = isfloat(s2)
print(f'{s1}: {r1}, {s2}: {r2}'# 1.23e-1: True, 1.23e: False


 Pythonでは全角の10進数字などでも数値への変換が可能なことは覚えておこう。以下に例を示す。ただし、符号(+/−)や小数点、指数表記のe/Eなどは半角でなければならない。

s = '123'  # 全角の10進数字でも変換可能
result = isint(s)
print(result)  # True

s = '+123' # 符号が全角だと変換できない
result = isint(s)
print(result)  # False


 半角の数字だけであるかまでを考慮に入れたいのであれば、以下の正規表現を使う方法を使う必要がある。

正規表現を使う

 正規表現を使って、次のような関数を定義してもよい。

import re

def isint2(s):  # 正規表現を使って判定を行う
    p = '[-+]?\d+'
    return True if re.fullmatch(p, s) else False

def isfloat2(s):  # 正規表現を使って判定を行う
    p = '[-+]?(\d+\.?\d*|\.\d+)([eE][-+]?\d+)?'
    return True if re.fullmatch(p, s) else False


 isint2関数は「0個か1個符号」に続けて「1個以上の10進数字」が並ぶパターンが文字列全体にマッチするかどうかを調べている。

 isfloat2関数は「0個か1個の符号」の後に、「1個以上の10進数字」「0個か1個の小数点(.)」「0個以上の10進数字」という文字の並びあるいは「小数点(.)」「1個以上の10進数字」が続き、最後に「指数表記を表すeかE」「0個が1個の符号」「1個以上の10進数字」というパターンが、文字列全体にマッチするかどうかを調べている。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。