检查字符串是否包含数字
- 2024-12-12 08:40:00
- admin 原创
- 172
问题描述:
我发现大多数问题都存在偏见,因为他们在数字中寻找字母,而我在我想要的无数字字符串中寻找数字。我需要输入一个字符串并检查它是否包含任何数字,如果它确实拒绝它。
仅当所有字符都是数字时,该函数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
>>>
关于此实施的几点。
any
更好,因为它像 C 语言中的短路表达式一样工作,并且一旦确定就会返回结果,即在字符串“a1bbbbbbc”的情况下,“b”和“c”甚至不会被比较。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)
这将返回所有包含字母和数字的字符串。isalpha() 返回包含全部数字或全部字符的字符串。
解决方案 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
。