我发现的大多数问题都偏向于这样一个事实,即他们在数字中寻找字母,而我在我想要的无数字符串中寻找数字。 我需要输入一个字符串并检查它是否包含任何数字,以及它是否拒绝它。
函数isdigit()仅当所有字符都是数字时才返回True。我只是想看看用户是否输入了一个数字,比如“我有一只狗”之类的句子。
什么好主意吗?
我发现的大多数问题都偏向于这样一个事实,即他们在数字中寻找字母,而我在我想要的无数字符串中寻找数字。 我需要输入一个字符串并检查它是否包含任何数字,以及它是否拒绝它。
函数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()返回全数字或全字符的字符串。