269

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

该函数仅在所有字符都是数字isdigit()时才返回。True我只是想看看用户是否输入了一个数字,比如一个句子之类的"I own 1 dog"东西。

有任何想法吗?

4

18 回答 18

406

您可以使用any功能,与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
于 2013-11-08T12:38:23.390 回答
70

您可以使用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
于 2013-11-08T12:39:57.547 回答
38

利用

str.isalpha()

参考:https ://docs.python.org/2/library/stdtypes.html#str.isalpha

如果字符串中的所有字符都是字母并且至少有一个字符,则返回 true,否则返回 false。

于 2015-06-28T02:20:05.130 回答
30

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
于 2015-08-06T16:40:54.890 回答
10

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

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

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

或者:

number = filter(str.isdigit, yourString)

有关更多信息,请查看正则表达式文档:http: //docs.python.org/2/library/re.html

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

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

第二种方法不起作用。

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

re.sub('[^\d.,]' , '', yourString)
于 2013-11-08T12:44:49.857 回答
3

您可以使用 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.')
于 2017-10-06T11:29:20.223 回答
3

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

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

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

不要在 python 2 中使用它作为map返回 a list,这会破坏any短路

于 2018-09-20T21:32:02.137 回答
2

这个如何?

import string

def containsNumber(line):
    res = False
    try:
        for val in line.split():
            if (float(val.strip(string.punctuation))):
                res = True
                break
    except ValueError:
        pass
    return res

containsNumber('234.12 a22') # returns True
containsNumber('234.12L a22') # returns False
containsNumber('234.12, a22') # returns True
于 2013-11-08T12:52:35.820 回答
2
import string
import random
n = 10

p = ''

while (string.ascii_uppercase not in p) and (string.ascii_lowercase not in p) and (string.digits not in p):
    for _ in range(n):
        state = random.randint(0, 2)
        if state == 0:
            p = p + chr(random.randint(97, 122))
        elif state == 1:
            p = p + chr(random.randint(65, 90))
        else:
            p = p + str(random.randint(0, 9))
    break
print(p)

此代码生成一个大小为 n 的序列,其中至少包含一个大写字母、小写字母和一个数字。通过使用 while 循环,我们保证了这个事件。

于 2018-10-05T12:46:56.327 回答
2

我会让@zyxue 的答案更明确一点:

RE_D = re.compile('\d')

def has_digits(string):
    res = RE_D.search(string)
    return res is not None

has_digits('asdf1')
Out: True

has_digits('asdf')
Out: False

这是@zyxue在答案中提出的解决方案中基准最快的解决方案。

于 2020-01-10T19:51:31.870 回答
2

此外,您可以使用正则表达式 findall。这是一个更通用的解决方案,因为它增加了对数字长度的更多控制。在您需要最小长度的数字的情况下,这可能会有所帮助。

s = '67389kjsdk' 
contains_digit = len(re.findall('\d+', s)) > 0
于 2020-12-14T14:03:02.197 回答
2

您可以按如下方式完成此操作:

if a_string.isdigit(): do_this() else: do_that()

https://docs.python.org/2/library/stdtypes.html#str.isdigit

使用.isdigit()还意味着在您需要使用列表理解的情况下(try/except 在列表理解中是不可能的),不必求助于异常处理(try/except)。

于 2018-03-15T17:00:37.070 回答
2

any并且ord可以组合以达到如下所示的目的。

>>> 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
>>>

关于这个实现的几点。

  1. any更好,因为它像 C 语言中的短路表达式一样工作,并且会在确定后立即返回结果,即在字符串 'a1bbbbbbc' 'b's 和 'c's 的情况下甚至不会进行比较。

  2. ord更好,因为它提供了更大的灵活性,例如仅在“0”和“5”或任何其他范围之间的检查数字。例如,如果您要为数字的十六进制表示编写验证器,则您希望字符串仅具有“A”到“F”范围内的字母。

于 2019-07-24T18:24:01.627 回答
2

这可能不是 Python 中最好的方法,但作为 Haskeller,这种 lambda/map 方法对我来说非常有意义,而且非常简短:

anydigit = lambda x: any(map(str.isdigit, x))

当然不需要命名。命名它可以使用 like anydigit("abc123"),感觉就像我在寻找什么!

于 2020-05-21T09:22:03.087 回答
2

您可以使用 range 和 count 通过检查范围来检查数字在字符串中出现的次数:

def count_digit(a):
    sum = 0
    for i in range(10):
        sum += a.count(str(i))
    return sum

ans = count_digit("apple3rh5")
print(ans)

#This print 2
于 2017-09-29T19:20:53.790 回答
1

更简单的解决方法是

s = '1dfss3sw235fsf7s'
count = 0
temp = list(s)
for item in temp:
    if(item.isdigit()):
        count = count + 1
    else:
        pass
print count
于 2018-06-15T05:49:41.493 回答
1

This too will work.

if any(i.isdigit() for i in s):
    print("True")
于 2020-12-18T14:33:09.060 回答
1
alp_num = [x for x in string.split() if x.isalnum() and re.search(r'\d',x) and 
re.search(r'[a-z]',x)]

print(alp_num)

这将返回所有同时包含字母和数字的字符串。isalpha() 返回包含所有数字或所有字符的字符串。

于 2019-11-04T13:21:55.427 回答