您如何在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 == True始终为False
Sukrit Kalra 2014年

1
除以下答案外,“非Pythonic”方式是:[如果isbn中的x在'0123456789'中为x,则为isbn中的x]。如果用户把分离的ISBN,您可以扩展-把它们添加到列表
考克斯

1
如果您正在阅读ISBN号,我建议使用正则表达式。ISBN的长度可以为10或13位数字,并具有其他限制。这里有很多与之匹配的正则表达式命令列表:regexlib.com/…其中许多还可以让您正确阅读ISBN连字符,这使人们可以更轻松地复制和粘贴。
凯文(Kevin)

1
@Kevin而且,虽然13位ISBN确实仅是数字,但10位ISBN可以将X作为最后一个字符。
TRiG

Answers:


248

您需要isdigitstr对象上使用方法:

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

isdigit文档中

str.isdigit()

如果字符串中的所有字符都是数字并且至少有一个字符,则返回True,否则返回False。数字包括需要特殊处理的十进制字符和数字,例如兼容性上标数字。它涵盖了不能用于​​以10为底的数字的数字,例如Kharosthi数字。形式上,数字是具有属性值Numeric_Type =数字或Numeric_Type =十进制的字符。


16
值得注意的是,这可能不是您真正想要的支票。这将检查所有字符是否都为数字,而不是字符串是否为可解析数字。例如,字符串“⁰”(即Unicode上标零)确实通过了isdigit,但ValueError如果传递给,则会引发a int()
danpalmer

42

用途str.isdigit

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

我不知道该方法存在。我一直都做着try: assert str(int(foo)) == foo; except (AssertionError,ValueError): #handle,这感觉就像罪恶一样丑陋。谢谢!
亚当·斯密

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个eg表示您的字符串中没有任何内容。因此,您可以按照其提供的相应解决方案进行操作。


1
re.match('^[0-9\.]*$',word)浮动失败。if(bool(re.search(r'\d', word)))虽然工作正常。

2

关于什么浮点数底片号码等。所有的例子之前,将是错误的。

到现在为止,我得到了类似的东西,但我认为它可能会好得多:

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

仅当存在一个或没有“。”时返回true。在数字字符串中。

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

将返回假


之前的所有示例都是错误的。这不是因为问题是关于其他问题吗?
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。为了避免多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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.