文字列に数字のみが含まれているかどうかをPythonでどのようにチェックしますか?


129

文字列に数字のみが含まれているかどうかをどのように確認しますか?

ここで試してみました。これを達成するための最も簡単な方法を見たいのですが。

import string

def main():
    isbn = input("Enter your 10 digit ISBN number: ")
    if len(isbn) == 10 and string.digits == True:
        print ("Works")
    else:
        print("Error, 10 digit number was not inputted and/or letters were inputted.")
        main()

if __name__ == "__main__":
    main()
    input("Press enter to exit: ")

1
常にに評価されるFalseため、コードは常に戻ります。string.digits == TrueFalse
Sukrit Kalra 2014年

1
以下の回答を除いて、「非Pythonic」の方法はif [x for x in isbn if x in '0123456789']の場合です。ユーザーがisbnにセパレータを配置した場合に拡張できること-リストにセパレータを追加
cox

1
ISBN番号を読んでいる場合は、正規表現を使用することをお勧めします。ISBNは10桁または13桁の長さにすることができ、追加の制限があります。regexlib.com/…これらを照合するためのregexコマンドの適切なリストがあります。これらの多くは、ISBNハイフンを正しく読み取ることができるため、人々がコピーして貼り付けやすくなります。
ケビン

1
@Kevinそして、13桁のISBNは確かに数字のみですが、10桁のISBNはXを最後の文字として持つことができます。
TRiG 2017年

回答:


248

オブジェクトでisdigitメソッドを使用する必要がありstrます。

if len(isbn) == 10 and isbn.isdigit():

isdigitドキュメントから:

str.isdigit()

文字列のすべての文字が数字であり、少なくとも1つの文字がある場合はTrueを返し、そうでない場合はFalseを返します。数字には、互換性の上付き数字など、特別な処理が必要な小数点文字や数字が含まれます。これは、Kharosthi数のように、基数10で数を形成するために使用できない数字をカバーします。正式には、数字はプロパティ値がNumeric_Type = DigitまたはNumeric_Type = Decimalの文字です。


16
これは実際に必要なチェックではない可能性があることに注意してください。これは、文字列が解析可能な数値ではなく、すべての文字が数字のようであることを確認します。たとえば、文字列 "⁰"(つまり、Unicode上付き文字のゼロ)はを渡しますがisdigit、にValueError渡された場合はを発生させint()ます。
ダンパルマー

42

使用str.isdigit

>>> "12345".isdigit()
True
>>> "12345a".isdigit()
False
>>>

その方法が存在することを私は知りませんでした。私はいつもやっtry: assert str(int(foo)) == foo; except (AssertionError,ValueError): #handleていましたが、罪のように醜く感じました。ありがとう!
Adam Smith

10

文字列isdigit関数を使用:

>>> s = '12345'
>>> s.isdigit()
True
>>> s = '1abc'
>>> s.isdigit()
False

3

あなたは正規表現を使うこともできます、

import re

例:-1)word = "3487954"

re.match('^[0-9]*$',word)

例:-2)word = "3487.954"

re.match('^[0-9\.]*$',word)

例:-3)word = "3487.954 328"

re.match('^[0-9\.\ ]*$',word)

あなたが見ることができるように3つすべては例えばあなたのひもに何もないことを意味します。したがって、あなたはそれらと共に与えられたそれぞれの解決策に従うことができます。


1
re.match('^[0-9\.]*$',word)floatの場合は失敗します。if(bool(re.search(r'\d', word)))でもうまくいきます。

2

浮動小数点数負の数などについてはどうでしょう。前の例はすべて間違っています。

今まで私はこのようなものを手に入れましたが、それははるかに良いかもしれないと思います:

'95.95'.replace('.','',1).isdigit()

「。」が1つあるか、ない場合にのみtrueを返します。数字列内。

'9.5.9.5'.replace('.','',1).isdigit()

falseを返します


以前の例はすべて間違っています。質問が何か他のものについてであるからではないですか?
AMC

2

このコメントで指摘されているように、文字列に数字のみが含まれているかどうかをPythonでどのようにチェックしますか?このisdigit()メソッドは、一部の数字のような文字に対してTrueを返すため、このユースケースでは完全に正確ではありません。

>>> "\u2070".isdigit() # unicode escaped 'superscript zero' 
True

これを回避する必要がある場合、次の簡単な関数は、文字列内のすべての文字が「0」から「9」までの数字であるかどうかをチェックします。

import string

def contains_only_digits(s):
    # True for "", "0", "123"
    # False for "1.2", "1,2", "-1", "a", "a1"
    for ch in s:
        if not ch in string.digits:
            return False
    return True

質問の例で使用されます:

if len(isbn) == 10 and contains_only_digits(isbn):
    print ("Works")

小さなことですが、関数はに簡略化できますall(ch in string.digits for ch in s)
AMC

1

ここでtry catchブロックを使用できます。

s="1234"
try:
    num=int(s)
    print "S contains only digits"
except:
    print "S doesn't contain digits ONLY"

これは整数でのみ機能し、浮動小数点数には(。)が含まれているため常に失敗します
Eddwin Paz

2
また、どの例外を処理するかを指定しないことは常に悪い習慣です。この場合は、次のようになりますexcept ValueError:
J0ANMM

これは正しくありませんが、違いますか?int("1_000")たとえば、エラーにはなりません。
AMC

1

チェックで問題が発生するたびにstrがNoneになることがあるので、strがNoneになる可能性がある場合、エラーが発生するため、str.isdigit()を使用するだけでは不十分です。

AttributeError: 'NoneType'オブジェクトに属性 'isdigit'がありません

次に、まずstrがNoneかどうかを検証する必要があります。multi-if分岐を回避するための明確な方法は次のとおりです。

if str and str.isdigit():

これが私のように同じ問題を抱えている人々に役立つことを願っています。


1

文字列がすべての数字を持っているかどうかを確認するために私が考えることができる2つの方法があります

方法1(Pythonで組み込みのisdigit()関数を使用):-

>>>st = '12345'
>>>st.isdigit()
True
>>>st = '1abcd'
>>>st.isdigit()
False

方法2(文字列の上で例外処理を実行する):-

st="1abcd"
try:
    number=int(st)
    print("String has all digits in it")
except:
    print("String does not have all digits in it")

上記のコードの出力は次のようになります。

String does not have all digits in it

そのような場合を除いてベアを使用することは悪い習慣です。たとえば、ベア 'except'を使用して何が問題になっていますか?を参照してください
AMC

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.