Como você verifica em python se uma string contém apenas números?


129

Como você verifica se uma string contém apenas números?

Eu dei uma chance aqui. Eu gostaria de ver a maneira mais simples de conseguir isso.

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
Seu código sempre retornará, Falsepois string.digits == Truesempre é avaliado como False.
precisa saber é o seguinte

1
Exceto as respostas abaixo, um modo "não pitonico" é se [x para x em isbn se x em '0123456789']; que você pode estender se o usuário colocar separadores no ISBN - adicioná-los à lista
cox

1
Eu recomendo usar regex se você estiver lendo números ISBN. Os ISBNs podem ter 10 ou 13 dígitos e têm restrições adicionais. Há uma boa lista de comandos regex para correspondê-los aqui: regexlib.com/… Muitos deles também permitem que você leia corretamente os hífens do ISBN, o que tornará mais fácil para as pessoas copiar e colar.
Kevin Kevin

1
@ Kevin E, embora os ISBNs de 13 dígitos sejam realmente apenas dígitos, os ISBNs de 10 dígitos podem ter X como caractere final.
Trig

Respostas:


248

Você deseja usar o isdigitmétodo em seu strobjeto:

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

A partir da isdigitdocumentação :

str.isdigit ()

Retorno True se todos os caracteres da string forem dígitos e houver pelo menos um caractere, caso contrário, False. Os dígitos incluem caracteres decimais e dígitos que precisam de tratamento especial, como os dígitos sobrescritos de compatibilidade. Isso abrange dígitos que não podem ser usados ​​para formar números na base 10, como os números de Kharosthi. Formalmente, um dígito é um caractere que possui o valor da propriedade Numeric_Type = Digit ou Numeric_Type = Decimal.


16
Vale a pena notar que esta pode não ser a seleção que você realmente deseja. Isso verifica se todos os caracteres são do tipo dígito , não que a sequência seja um número analisável. Por exemplo, a cadeia "⁰" (que é um sobrescrito unicode zero) passa isdigit, mas gera a ValueErrorse passada para int().
danpalmer

42

Use str.isdigit:

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

Eu não tinha ideia de que esse método existia. Eu sempre fiz try: assert str(int(foo)) == foo; except (AssertionError,ValueError): #handlee me senti feio como pecado. Obrigado!
Adam Smith

10

Use a função string isdigit :

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

3

Você também pode usar o regex,

import re

por exemplo: -1) palavra = "3487954"

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

por exemplo: -2) palavra = "3487.954"

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

por exemplo: -3) palavra = "3487.954 328"

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

Como você pode ver todos os 3, por exemplo, significa que apenas não há na sua string. Então você pode seguir as respectivas soluções fornecidas com eles.


1
re.match('^[0-9\.]*$',word)falha para carros alegóricos. if(bool(re.search(r'\d', word)))funciona bem embora.

2

Que tal números flutuantes , números negativos , etc. Todos os exemplos anteriores estarão errados.

Até agora, consegui algo assim, mas acho que poderia ser muito melhor:

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

retornará true somente se houver um ou não '.' na sequência de dígitos.

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

retornará falso


Todos os exemplos anteriores estarão errados. Não é porque a pergunta é sobre outra coisa?
AMC

2

Como apontado neste comentário Como você verifica em python se uma string contém apenas números? o isdigit()método não é totalmente preciso para este caso de uso, porque retorna True para alguns caracteres semelhantes a dígitos:

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

Se isso precisar ser evitado, a função simples a seguir verifica se todos os caracteres de uma string têm um dígito entre "0" e "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

Usado no exemplo da pergunta:

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

É uma coisa pequena, mas a função pode ser simplificada all(ch in string.digits for ch in s).
AMC

1

Você pode usar o bloco try catch aqui:

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

isso só funciona com inteiros, com números flutuador sempre falhará uma vez que contém a (.)
Eddwin Paz

2
Além disso, é sempre uma prática ruim não especificar qual exceção você deseja manipular. Nesse caso, deve ser:except ValueError:
J0ANMM 24/01

Isso não está correto, não? int("1_000")não leva a um erro, por exemplo.
AMC

1

Como toda vez que encontro um problema com a verificação é porque o str pode ser None às vezes, e se o str puder ser None, use apenas str.isdigit () não é suficiente, pois você receberá um erro

AttributeError: o objeto 'NoneType' não tem atributo 'isdigit'

e então você precisa primeiro validar o str é None ou não. Para evitar uma ramificação multi-if, uma maneira clara de fazer isso é:

if str and str.isdigit():

Espero que isso ajude as pessoas a terem o mesmo problema que eu.


1

Existem 2 métodos em que posso pensar para verificar se uma string tem todos os dígitos de não

Método 1 (Usando a função isdigit () interna em python): -

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

Método 2 (Executando o tratamento de exceções na parte superior da seqüência de caracteres): -

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

A saída do código acima será:

String does not have all digits in it

Usar um bare, exceto assim, é uma má prática, veja, por exemplo, o que há de errado em usar um bare 'except'? .
AMC

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.