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

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

什么好主意吗?


当前回答

你可以这样完成:

如果a_string.isdigit (): do_this () 其他: do_that ()

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

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

其他回答

迭代器方法。它消耗所有字符,除非满足一个数字。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)
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循环,我们保证了这个事件。

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

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

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

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

我让@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在答案上提出的方案中,哪个是基准测试最快的方案?

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()返回全数字或全字符的字符串。