Проверьте, содержит ли строка число

Большинство вопросов, которые я нашел, смещены на тот факт, что они ищут буквы в своих числах, в то время как я ищу цифры в том, что я хотел бы быть бесчисленной строкой. Мне нужно ввести строку и проверить, содержит ли она какие-либо числа и отклоняет ли она.

Функция isdigit() возвращает True только если ВСЕ символы являются числами. Я просто хочу посмотреть, ввел ли пользователь число, например предложение "У меня есть 1 собака" или что-то в этом роде.

Есть идеи?

Ответ 1

Вы можете использовать any, с str.isdigit, как это

>>> def hasNumbers(inputString):
...     return any(char.isdigit() for char in inputString)
... 
>>> hasNumbers("I own 1 dog")
True
>>> hasNumbers("I own no dog")
False

В качестве альтернативы вы можете использовать регулярное выражение, например

>>> import re
>>> def hasNumbers(inputString):
...     return bool(re.search(r'\d', inputString))
... 
>>> hasNumbers("I own 1 dog")
True
>>> hasNumbers("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

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 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

Ответ 4

использовать

str.isalpha() 

Ссылка: https://docs.python.org/2/library/stdtypes.html#str.isalpha

Возвращает true, если все символы в строке являются алфавитными и там по крайней мере, один символ, в противном случае - false.

Ответ 5

Вы можете применить функцию isdigit() к каждому символу в строке. Или вы можете использовать регулярные выражения.

Также я нашел Как найти одно число в строке в Python? с очень подходящими способами вернуть цифры. Решение ниже от ответа на этот вопрос.

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

В качестве альтернативы:

number = filter(str.isdigit, yourString)

Для получения дополнительной информации ознакомьтесь с документом regex: http://docs.python.org/2/library/re.html.

Изменение: Возвращает действительные числа, а не логическое значение, поэтому приведенные выше ответы более верны для вашего случая.

Первый метод возвращает первую цифру и последующие последовательные цифры. Таким образом, 1.56 будет возвращено как 1. 10000 будет возвращено как 10. 0207-100-1000 будет возвращено как 0207.

Второй метод не работает.

Чтобы извлечь все цифры, точки и запятые и не потерять непоследовательные цифры, используйте:

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

Ответ 6

Как насчет этого?

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

Ответ 7

Вы можете использовать диапазон с количеством, чтобы проверить, сколько раз число появляется в строке, сравнивая его с диапазоном:

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

Ответ 8

Вы можете использовать метод NLTK для этого.

Это найдет "1" и "один" в тексте:

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.')

Ответ 9

Вы можете сделать это следующим образом:

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

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

Использование .isdigit() также означает, что вам не нужно прибегать к обработке исключений (попробуйте/исключить) в тех случаях, когда вам нужно использовать понимание списка (попробовать/исключить невозможно в понимании списка).

Ответ 10

Более простой способ решить как

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

Ответ 11

Я удивлен, что никто не упомянул эту комбинацию any и map:

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

в Python 3 он, вероятно, самый быстрый (за исключением, может быть, регулярных выражений), потому что он не содержит никакого цикла (а псевдонимы функции избегают его поиска в str).

Не используйте это в Python 2, так как map возвращает list, который прерывает any короткое замыкание

Ответ 12

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, мы гарантировали это событие.

Ответ 13

Вы можете использовать свойство пересечения set для проверки, содержит ли строка какие-либо цифры. set() любой строки преобразует каждый символ строки как отдельные элементы набора.

>>> s = 'Abcd123#'
>>> s
{'#', '1', '2', '3', 'A', 'b', 'c', 'd'}
>>> if len(set('0123456789').intersection(set(s))):
    ... print('string contains number')
string contains number

Ответ 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 них лучше, потому что она работает как выражение короткого замыкания в языке Си и будет возвращать результат, как только его можно будет определить, т.е. в случае строки 'a1bbbbbbc' 'b и' c даже не будут сравниваться.

  2. ord лучше, потому что он обеспечивает большую гибкость, например, контрольные числа только между "0" и "5" или любым другим диапазоном. Например, если вы хотите написать валидатор для шестнадцатеричного представления чисел, вы бы хотели, чтобы строка имела алфавиты только в диапазоне от "A" до "F".