检查字符串是否包含数字

2024-12-12 08:40:00
admin
原创
172
摘要:问题描述:我发现大多数问题都存在偏见,因为他们在数字中寻找字母,而我在我想要的无数字字符串中寻找数字。我需要输入一个字符串并检查它是否包含任何数字,如果它确实拒绝它。仅当所有字符都是数字时,该函数isdigit()才会返回。我只是想看看用户是否输入了数字,所以像这样的句子或类似的东西。True`"I own ...

问题描述:

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

仅当所有字符都是数字时,该函数isdigit()才会返回。我只是想看看用户是否输入了数字,所以像这样的句子或类似的东西。True`"I own 1 dog"`

有什么想法吗?


解决方案 1:

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

解决方案 2:

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

解决方案 3:

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

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

解决方案 4:

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

解决方案 5:

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

解决方案 6:

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

import re    

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 在答案中提出的解决方案中基准最快的解决方案。

解决方案 7:

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

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

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

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

解决方案 8:

您还可以使用 set.intersection,它非常快,对于小字符串来说比正则表达式更好。

def contains_number(string):
    return True if set(string).intersection('0123456789') else False

解决方案 9:

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

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

解决方案 10:

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 循环,我们保证了此事件的发生。

解决方案 11:

这也能起作用。

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

解决方案 12:

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

解决方案 13:

您可以使用带有计数的范围来检查数字在字符串中出现的次数,方法是根据范围进行检查:

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

解决方案 14:

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”和“c”甚至不会被比较。

  2. ord更好,因为它提供了更多的灵活性,例如只检查“0”到“5”之间的数字或任何其他范围。例如,如果您要编写一个用于十六进制数字表示的验证器,您会希望字符串只包含“A”到“F”范围内的字母。

解决方案 15:

这个怎么样?

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

解决方案 16:

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

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

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

使用.isdigit()还意味着在需要使用列表推导式(在列表推导式中无法使用 try/except)的情况下不必诉诸异常处理(try/except)。

解决方案 17:

更简单的解决方法是

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

解决方案 18:

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)

这将返回所有包含字母和数字的字符串。i​​salpha() 返回包含全部数字或全部字符的字符串。

解决方案 19:

如果您要检查 df 列中的值是否包含任何数字:

df['x'].str.contains(r'd', regex=True))

解决方案 20:

一种迭代器方法。除非满足数字,否则它将使用所有字符。fix 的第二个参数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)

解决方案 21:

我很惊讶没有人使用过 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

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用