如何在Python中检查一个字符串是否只包含数字?

177

你如何检查一个字符串是否只包含数字?

我在这里尝试了一下。我想看到最简单的方法来实现这个。

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”的方法是使用 [x for x in isbn if x in '0123456789'];如果用户在ISBN中添加分隔符,则可以将它们添加到列表中。 - cox
1
如果您正在读取ISBN号码,我建议使用正则表达式。 ISBN可以是10或13位数字,并且有其他限制。这里有一个很好的正则表达式命令列表,可用于匹配它们:http://regexlib.com/Search.aspx?k=isbn&AspxAutoDetectCookieSupport=1 其中许多还可以让您正确读取ISBN连字符,这将使人们更容易复制和粘贴。 - Kevin
1
@Kevin 而且,虽然13位ISBN确实只有数字,但10位ISBN的最后一位可以是X。 - TRiG
12个回答

301
你需要在你的str对象上使用isdigit方法:
if len(isbn) == 10 and isbn.isdigit():

来自isdigit文档:

str.isdigit()

如果字符串中所有字符都是数字并且至少有一个字符,则返回True,否则返回False。数字包括十进制字符和需要特殊处理的数字,例如兼容上标数字。这包括不能用于形成十进制数字的数字,如Kharosthi数字。在形式上,数字是指具有属性值Numeric_Type = Digit或Numeric_Type = Decimal的字符。


30
值得注意的是,这可能不是您实际想要的检查。它检查所有字符是否类似于数字,而不是检查字符串是否可解析为数字。例如,字符串"⁰"(即Unicode上标零),确实通过了isdigit检查,但如果传递给int()函数,则会引发ValueError错误。 - danpalmer
感谢 @danpalmer 的相关评论。我想确保我的字符串只包含整数(正数或负数),所以我需要做一些更明确的操作,就像这里中所示。 - GreenEye
@danpalmer 检查 str.isascii() and str.isdigit() 不就足够了吗? - undefined

56

使用str.isdigit

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

1
我从来不知道这个方法的存在。我一直都是用 try: assert str(int(foo)) == foo; except (AssertionError,ValueError): #handle 这种方式,但感觉很丑陋。谢谢! - Adam Smith
1
请记住,"²".isdigit()(上标为2)返回True,但是int("²")会出错。 - Discrete Games

17

使用字符串isdigit函数:

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

9
您可以使用正则表达式。
import re

例如:-1) word = "3487954"

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

eg:-2) 单词 = "3487.954"

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

例如:-3)word =“3487.954 328”

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

正如您所看到的,所有3个示例都表示字符串中只有“no”这一个词。因此,您可以按照它们提供的相应解决方案进行操作。


1
re.match('^[0-9\.]*$',word) 对于浮点数无法匹配成功。但是 if(bool(re.search(r'\d', word))) 可以正常工作。 - user5512021

4

正如在这条评论中指出的那样【如何在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")

1
这虽然是一件小事,但该函数可以简化为 all(ch in string.digits for ch in s) - AMC

3

那么对于浮点数负数等呢?之前的例子都是错误的。

目前我得到了这样的结果,但我认为它还有很大的改进空间:

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

只有在数字字符串中只有一个或零个点号时,才会返回true。

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

将返回false


之前的所有例子都是错的。这不是因为问题本身就与其他事情有关吗? - AMC

2

每次我遇到检查问题的时候,都是因为字符串有时可能为None,如果字符串可能为None,则仅使用str.isdigit()是不够的,因为您将收到错误

AttributeError:'NoneType'对象没有属性'isdigit'

然后您需要首先验证str是否为None。 为了避免多个if分支,一种清晰的方法是:

if str and str.isdigit():

希望这能帮助那些和我有相同问题的人。

实际上,isdigit确保str为真,因为如果没有至少一个字符,isdigit将返回False。因此,如果您想使用isdigit,可以删除str。 - Justin Furuness
你不应该使用 str 作为变量名,因为它会覆盖同名的内置函数。 - jtlz2

1
您可以在这里使用try catch块:
s="1234"
try:
    num=int(s)
    print "S contains only digits"
except:
    print "S doesn't contain digits ONLY"

这仅适用于整数,使用浮点数将始终失败,因为它包含一个(.)。 - Eddwin Paz
3
不指定要处理哪个异常是一种不好的做法。在这种情况下,应该使用:except ValueError: - J0ANMM
这不正确,对吧?例如int("1_000")不会导致错误。 - AMC

1

您可以使用 str.isdigit() 方法或 str.isnumeric() 方法


3
这不是与前两个答案相同的解决方案吗(https://dev59.com/u2Ei5IYBdhLWcg3wUa86#21388567,https://dev59.com/u2Ei5IYBdhLWcg3wUa86#21388552)? - AMC

1

我能想到两种方法来检查一个字符串是否包含所有数字

方法1(使用Python内置的isdigit()函数):

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

方法二(在字符串顶部执行异常处理):

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

1
使用类似于 bare except 的语法是不好的实践,例如请参考 What is wrong with using a bare 'except'? - AMC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接