Check if a string contains a number
我发现的大多数问题都偏向于这样一个事实:他们在寻找数字中的字母,而我在寻找数字,我希望它是一个无数字的字符串。我需要输入一个字符串并检查它是否包含任何数字,以及是否拒绝它。
如果所有字符都是数字,函数
有什么想法吗?
您可以使用
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 |
您可以使用
1 2 | def num_there(s): return any(i.isdigit() for i in s) |
如果字符串中存在数字,函数将返回
演示:
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) |
您可以按如下方式完成:
do_this()
else:
do_that()
https://docs.python.org/2/library/stdtypes.html_str.isdigit
使用
您可以使用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循环,我们保证了这个事件。
我很惊讶没有人提到过
1 2 3 | def contains_digit(s): isdigit = str.isdigit return any(map(isdigit,s)) |
在python 3中,它可能是最快的(regex除外),因为它不包含任何循环(对函数进行别名可以避免在
不要在python 2中使用它,因为
更简单的解决方法是
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 |