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

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

什么好主意吗?


当前回答

您可以使用NLTK方法。

这将在文本中找到'1'和'One':

import nltk 

def existence_of_numeric_data(text):
    text=nltk.word_tokenize(text)
    pos = nltk.pos_tag(text)
    count = 0
    for i in range(len(pos)):
        word , pos_tag = pos[i]
        if pos_tag == 'CD':
            return True
    return False

existence_of_numeric_data('We are going out. Just five you and me.')

其他回答

迭代器方法。它消耗所有字符,除非满足一个数字。next的第二个参数修复当迭代器为“空”时返回的默认值。在这种情况下,它被设置为False,但也“工作,因为它被强制转换为if中的布尔值。

def has_digit(string):
    str_iter = iter(string)
    while True:
        char = next(str_iter, False)
        # check if iterator is empty
        if char:
            if char.isdigit():
                return True
        else:
            return False

或者只看生成器理解的第一项

def has_digit(string):
    return next((True for char in string if char.isdigit()), False)

可以对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)

我很惊讶没有人提到any和map的组合:

def contains_digit(s):
    isdigit = str.isdigit
    return any(map(isdigit,s))

在python3中,它可能是最快的(可能除了正则表达式),因为它不包含任何循环(并且使函数别名避免在str中查找它)。

不要在python2中使用它,因为map返回一个列表,这会破坏任何短路

我很惊讶没有人使用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。

你也可以使用set.intersection 它非常快,对于小字符串来说比regex更好。

def contains_number(string):
    return True if set(string).intersection('0123456789') else False