检查字符串是否包含数字

我发现的大多数问题都有偏见,他们在数字中寻找字母,而我在我想要的无数字符串中寻找数字。 我需要输入一个字符串,检查它是否包含任何数字,如果它拒绝它

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

什么好主意吗?

589602 次浏览

你可以像这样使用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

你可以使用anystr.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

可以对String中的每个字符应用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)

这个怎么样?

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

使用Python方法str.isalpha()。如果字符串中所有字符都是字母,并且至少有一个字符,则此函数返回True;否则返回False。

Python Docs: https://docs.python.org/3/library/stdtypes.html#str.isalpha

https://docs.python.org/2/library/re.html < a href = " 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

你可以使用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

您可以使用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.')

你可以这样完成:

< p > <代码>如果a_string.isdigit (): do_this () 其他: do_that() < /代码> < / p >

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

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

更简单的解决方法是

s = '1dfss3sw235fsf7s'
count = 0
temp = list(s)
for item in temp:
if(item.isdigit()):
count = count + 1
else:
pass
print count

我很惊讶没有人提到anymap的组合:

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

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

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

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循环,我们保证了这个事件。

anyord可以组合起来,如下所示。

>>> 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'和' C '甚至不会进行比较。

  2. ord更好,因为它提供了更多的灵活性,比如只检查'0'和'5'之间的数字或任何其他范围。例如,如果你要为数字的十六进制表示写一个验证器,你会希望字符串的字母只在' a '到'F'的范围内。

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

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

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

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

当然不需要说出来。命名它可以像anydigit("abc123")一样使用,这感觉就像我正在寻找的!

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

s = '67389kjsdk'
contains_digit = len(re.findall('\d+', s)) > 0

这也会起作用。

if any(i.isdigit() for i in s):
print("True")

迭代器方法。它消耗所有字符,除非满足一个数字。next的第二个参数修复默认值,当迭代器为“;empty"”时返回。在这种情况下,它被设置为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)

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

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