【问题标题】:How do you check in python whether a string contains only numbers?你如何在python中检查一个字符串是否只包含数字?
【发布时间】:2014-02-18 17:52:47
【问题描述】:

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

我已经尝试过了。我想看看实现这一点的最简单方法。

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: ")

【问题讨论】:

  • 您的代码将始终返回 False,因为 string.digits == True 始终计算为 False。
  • 除了下面的答案,“非 Pythonic”方式是 if [x for x in isbn if x in '0123456789'];如果用户在 isbn 中放置分隔符,您可以扩展 - 将它们添加到列表中
  • 如果您正在阅读 ISBN 编号,我建议您使用正则表达式。 ISBN 的长度可以是 10 位或 13 位,并且有额外的限制。这里有一个很好的正则表达式命令列表来匹配它们:regexlib.com/… 其中许多还可以让您正确阅读 ISBN 连字符,这将使人们更容易复制和粘贴。
  • @Kevin 而且,虽然 13 位 ISBN 确实只是数字,但 10 位 ISBN 可以将 X 作为最后一个字符。

标签: python string numbers


【解决方案1】:

您需要在 str 对象上使用 isdigit 方法:

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

来自isdigit documentation:

str.isdigit()

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

【讨论】:

  • 值得注意的是,这可能不是您真正想要的检查。这会检查所有字符是否都是类似数字的,而不是检查字符串是否是可解析的数字。例如,字符串“⁰”(即 unicode 上标零)确实传递了isdigit,但如果传递给int(),则会引发ValueError。
  • 感谢@danpalmer 非常相关的评论。我想确保我的字符串只是一个整数(正数或负数),所以我需要做一些更明确的事情,如here
【解决方案2】:

使用str.isdigit:

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

【讨论】:

  • 我不知道该方法存在。我一直都这样做try: assert str(int(foo)) == foo; except (AssertionError,ValueError): #handle,感觉丑得像罪恶。谢谢!
  • 记住"²".isdigit()(2个上标)返回True但int("²")错误。
【解决方案3】:

使用字符串isdigit函数:

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

【讨论】:

    【解决方案4】:

    你也可以使用正则表达式,

    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 意味着您的字符串中只有 no。因此,您可以按照他们提供的相应解决方案进行操作。

    【讨论】:

    • re.match('^[0-9\.]*$',word) 浮点数失败。 if(bool(re.search(r'\d', word))) 工作正常。
    【解决方案5】:

    正如评论中指出的How do you check in python whether a string contains only numbers? 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)。
    【解决方案6】:

    浮点数、负数等呢?前面的所有例子都是错误的。

    到目前为止,我得到了类似的东西,但我认为它可能会更好:

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

    只有在有一个或没有'.'时才会返回真。在数字字符串中。

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

    将返回 false

    【讨论】:

    • 前面所有的例子都是错的。那不是因为问题是关于别的吗?
    【解决方案7】:

    因为每次我遇到检查问题是因为 str 有时可以是 None,如果 str 可以是 None,只使用 str.isdigit() 是不够的,因为你会得到一个错误

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

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

    if str and str.isdigit():
    

    希望这对像我一样有同样问题的人有所帮助。

    【讨论】:

    • 实际上,isdigit 确保 str 是真实的,因为如果 isdigit 没有至少一个字符,它就会返回 False。因此,如果您想使用 isdigit,可以删除 str。
    【解决方案8】:

    你可以在这里使用 try catch 块:

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

    【讨论】:

    • 这只适用于整数,浮点数总是会失败,因为它包含一个 (.)
    • 此外,不指定要处理的异常总是一个不好的做法。在这种情况下应该是:except ValueError:
    • 这不正确,不是吗?例如,int("1_000") 不会导致错误。
    【解决方案9】:

    我可以想到两种方法来检查一个字符串是否所有数字都不是

    方法一(使用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
    

    【讨论】:

    【解决方案10】:

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

    【讨论】:

    猜你喜欢
    • 2016-05-09
    • 1970-01-01
    • 2015-09-28
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    • 2013-03-08
    • 2011-07-11
    相关资源
    最近更新 更多