我发现的大多数问题都偏向于这样一个事实,即他们在数字中寻找字母,而我在我想要的无数字符串中寻找数字。 我需要输入一个字符串并检查它是否包含任何数字,以及它是否拒绝它。

函数isdigit()仅当所有字符都是数字时才返回True。我只是想看看用户是否输入了一个数字,比如“我有一只狗”之类的句子。

什么好主意吗?


当前回答

我很惊讶没有人使用python操作符。使用它的工作原理如下:

foo = '1dfss3sw235fsf7s'
bar = 'lorem ipsum sit dolor amet'

def contains_number(string):
    for i in range(10):
        if str(i) in list(string):
            return True
    return False

print(contains_number(foo)) #True
print(contains_number(bar)) #False

或者我们可以使用函数isdigit():

foo = '1dfss3sw235fsf7s'
bar = 'lorem ipsum sit dolor amet'

def contains_number(string):
    for i in list(string):
        if i.isdigit():
            return True
    return False

print(contains_number(foo)) #True
print(contains_number(bar)) #False

这些函数基本上只是将s转换为一个列表,并检查列表中是否包含数字。如果是,则返回True,如果不是,则返回False。

其他回答

https://docs.python.org/2/library/re.html

你最好使用正则表达式。它要快得多。

import re

def f1(string):
    return any(i.isdigit() for i in string)


def f2(string):
    return re.search('\d', string)


# if you compile the regex string first, it's even faster
RE_D = re.compile('\d')
def f3(string):
    return RE_D.search(string)

# Output from iPython
# In [18]: %timeit  f1('assdfgag123')
# 1000000 loops, best of 3: 1.18 µs per loop

# In [19]: %timeit  f2('assdfgag123')
# 1000000 loops, best of 3: 923 ns per loop

# In [20]: %timeit  f3('assdfgag123')
# 1000000 loops, best of 3: 384 ns per loop

任何和单词都可以组合起来达到如下所示的目的。

>>> def hasDigits(s):
...     return any( 48 <= ord(char) <= 57 for char in s)
...
>>> hasDigits('as1')
True
>>> hasDigits('as')
False
>>> hasDigits('as9')
True
>>> hasDigits('as_')
False
>>> hasDigits('1as')
True
>>>

关于这个实现有几点。

any更好,因为它像C语言中的短路表达式一样工作,并且会在确定后立即返回结果,即在字符串'a1bbbbbbc'的情况下,'b'和' C '甚至不会进行比较。 Ord更好,因为它提供了更大的灵活性,比如只在“0”和“5”之间或任何其他范围内检查数字。例如,如果你要为数字的十六进制表示写一个验证器,你会希望字符串的字母只在' a '到'F'的范围内。

可以对String中的每个字符应用isdigit()函数。或者你可以使用正则表达式。

我还发现我如何在Python中找到一个字符串中的数字?用非常合适的方式返回数字。下面的答案来自于那个问题的答案。

number = re.search(r'\d+', yourString).group()

另外:

number = filter(str.isdigit, yourString)

有关更多信息,请查看regex文档:http://docs.python.org/2/library/re.html

编辑:这返回实际的数字,而不是布尔值,所以上面的答案更适合你的情况

第一个方法将返回第一个数字和随后的连续数字。因此,1.56将返回为1。10,000将返回为10。0207-100-1000将作为0207返回。

第二种方法行不通。

要提取所有数字,点和逗号,并且不丢失非连续的数字,使用:

re.sub('[^\d.,]' , '', yourString)

您可以像这样使用str.isdigit函数使用任何函数

def has_numbers(inputString):
    return any(char.isdigit() for char in inputString)

has_numbers("I own 1 dog")
# True
has_numbers("I own no dog")
# False

或者你也可以使用正则表达式,就像这样

import re
def has_numbers(inputString):
    return bool(re.search(r'\d', inputString))

has_numbers("I own 1 dog")
# True
has_numbers("I own no dog")
# False

你可以使用any和str.isdigit的组合:

def num_there(s):
    return any(i.isdigit() for i in s)

如果字符串中有数字,函数将返回True,否则返回False。

演示:

>>> king = 'I shall have 3 cakes'
>>> num_there(king)
True
>>> servant = 'I do not have any cakes'
>>> num_there(servant)
False