파이썬에서 문자열에 숫자 만 포함되어 있는지 어떻게 확인합니까?


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 == True됩니다 False.
Sukrit Kalra

1
아래의 답변을 제외하고, "비 Pythonic"방식은 다음과 같습니다. 사용자가 구분 기호를 isbn에 넣은 경우 확장 할 수 있음-목록에 추가
cox

1
ISBN 번호를 읽는 경우 정규식을 사용하는 것이 좋습니다. ISBN의 길이는 10 자리 또는 13 자리이며 추가 제한이 있습니다. regexlib.com/… 과 일치하는 정규식 명령 목록이 많이 있습니다.이 다수는 ISBN 하이픈을 올바르게 읽을 수있게하여 사람들이 쉽게 복사하여 붙여 넣을 수있게합니다.
케빈

1
@Kevin 그리고 13 자리 ISBN은 실제로 숫자 일 뿐이지 만 10 자리 ISBN은 X를 최종 문자로 사용할 수 있습니다.
TRiG

답변:


248

객체 에서 isdigit메소드 를 사용하고 싶을 것입니다 str.

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

로부터 isdigit문서 :

str.isdigit ()

문자열의 모든 문자가 숫자이고 하나 이상의 문자가 있으면 True를, 그렇지 않으면 False를 반환합니다. 숫자에는 호환성 위첨자 숫자와 같이 특수 처리가 필요한 10 진수 문자와 숫자가 포함됩니다. 이 숫자는 Kharosthi 숫자와 같이 10 진수로 숫자를 형성하는 데 사용할 수없는 숫자를 포함합니다. 공식적으로 숫자는 속성 값이 Numeric_Type = Digit 또는 Numeric_Type = Decimal 인 문자입니다.


16
이것이 실제로 원하는 수표가 아닐 수도 있습니다. 문자열이 구문 분석 가능한 숫자가 아니라 모든 문자가 숫자와 같은지 확인합니다. 예를 들어, 문자열 "⁰"(즉, 유니 코드 위첨자 0)은 전달 isdigit하지만 ValueErrorif에 전달되면 if를 발생 int()시킵니다.
danpalmer 2016

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) 단어 = "3487954"

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

예 : -2) 단어 = "3487.954"

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

예 : -3) 단어 = "3487.954 328"

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

보시다시피, 예를 들어 3은 모두 문자열에만 없음을 의미합니다. 그래서 당신은 그들과 함께 주어진 각각의 해결책을 따를 수 있습니다.


1
re.match('^[0-9\.]*$',word)수레에 실패합니다. if(bool(re.search(r'\d', word)))그래도 잘 작동합니다.

2

float 수 , 음수 등 은 어떻습니까? 이전의 모든 예제가 잘못되었습니다.

지금까지 나는 이와 같은 것을 얻었지만 훨씬 나아질 수 있다고 생각합니다.

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

'.'가 없거나없는 경우에만 true를 반환합니다. 자릿수로.

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

거짓을 반환합니다


이전의 모든 예가 잘못되었습니다. 질문이 다른 것에 관한 것이기 때문에 그렇지 않습니까?
AMC

2

이 주석에서 지적했듯이 문자열에 숫자 만 포함되어 있는지 파이썬에서 어떻게 확인합니까? 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"

이것은 정수에서만 작동합니다. float 숫자는 (.)을 포함하기 때문에 항상 실패합니다.
Eddwin Paz

2
또한 처리하려는 예외를 지정하지 않는 것은 항상 나쁜 습관입니다. 이 경우 다음과 같아야합니다.except ValueError:
J0ANMM

그래도 맞지 않습니까? int("1_000")예를 들어 오류가 발생하지 않습니다.
AMC

1

검사에 문제가 발생할 때마다 str은 때때로 None 일 수 있고 str이 None 일 수 있으면 str.isdigit () 만 사용하면 오류가 발생하기 때문에 충분하지 않습니다

AttributeError : 'NoneType'개체에 'isdigit'특성이 없습니다.

그런 다음 먼저 str이 없음인지 확인해야합니다. 다중 if 분기를 피하려면이를 수행하는 명확한 방법은 다음과 같습니다.

if str and str.isdigit():

이것이 나와 같은 문제가있는 사람들에게 도움이되기를 바랍니다.


1

문자열에 모든 숫자가 없는지 확인할 수있는 두 가지 방법이 있습니다.

방법 1 (파이썬에서 내장 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

이를 제외하고 베어 베어를 사용하는 것은 좋지 않습니다. 예를 들어 베어 '제외'를 사용하면 무엇이 문제입니까?를 참조하십시오 . .
AMC

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.