关于python:检查字符串是否包含数字

Check if a string contains a number

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

如果所有字符都是数字,函数isdigit()只返回True。我只想看看用户是否输入了一个数字,这样的句子"我有一条狗"之类的。

有什么想法吗?


您可以使用any函数,使用str.isdigit函数,如下所示

1
2
3
4
5
6
7
>>> def hasNumbers(inputString):
...     return any(char.isdigit() for char in inputString)
...
>>> hasNumbers("I own 1 dog")
True
>>> hasNumbers("I own no dog")
False

或者,可以使用正则表达式,如下所示

1
2
3
4
5
6
7
8
>>> import re
>>> def hasNumbers(inputString):
...     return bool(re.search(r'\d', inputString))
...
>>> hasNumbers("I own 1 dog")
True
>>> hasNumbers("I own no dog")
False


您可以使用anystr.isdigit的组合:

1
2
def num_there(s):
    return any(i.isdigit() for i in s)

如果字符串中存在数字,函数将返回True,否则返回False

演示:

1
2
3
4
5
6
>>> king = 'I shall have 3 cakes'
>>> num_there(king)
True
>>> servant = 'I do not have any cakes'
>>> num_there(servant)
False


https://docs.python.org/2/library/re.html网站

你最好使用正则表达式。速度快得多。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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


使用ZUU1〔8〕

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

Return true if all characters in the string are alphabetic and there
is at least one character, false otherwise.


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

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

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

可选地:

1
number = filter(str.isdigit, yourString)

有关更多信息,请参阅regex docu:http://docs.python.org/2/library/re.html

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

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

第二种方法不起作用。

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

1
re.sub('[^\d.,]' , '', yourString)

您可以按如下方式完成:

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

https://docs.python.org/2/library/stdtypes.html_str.isdigit

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


您可以使用nltk方法。

这将在文本中同时找到"1"和"one":

1
2
3
4
5
6
7
8
9
10
11
12
13
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.')

您可以使用带计数的范围来检查一个数字在字符串中出现的次数,方法是将其与范围进行检查:

1
2
3
4
5
6
7
8
9
10
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

这个怎么样?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import string

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

print containsNumber('234.12 a22') # returns True
print containsNumber('234.12L a22') # returns False
print containsNumber('234.12, a22') # returns True


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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循环,我们保证了这个事件。


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

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

在python 3中,它可能是最快的(regex除外),因为它不包含任何循环(对函数进行别名可以避免在str中查找它)。

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


更简单的解决方法是

1
2
3
4
5
6
7
8
9
s = '1dfss3sw235fsf7s'
count = 0
temp = list(s)
for item in temp:
    if(item.isdigit()):
        count = count + 1
    else:
        pass
print count