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



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



функция isdigit () возвращает true только в том случае, если все символы являются числами. Я просто хочу, чтобы увидеть, если пользователь ввел число, так как
"У меня есть 1 собака" или что-то.



какие идеи?

474   12  

12 ответов:

можно использовать any

вы можете использовать комбинацию 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

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

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

str.isalpha() 

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

возвращает true, если все символы в строке по алфавиту и есть есть хотя бы один символ, в противном случае false.

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

также я нашел как найти одно число в строке в Python? С очень подходящими способами возврата чисел. Решение ниже - это ответ на этот вопрос.

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

кроме того:

number = filter(str.isdigit, yourString)

для получения дополнительной информации взгляните на выражение дочу: http://docs.python.org/2/library/re.html

Edit: это возвращает фактические числа, а не логическое значение, поэтому ответы выше более корректны для вашего случая

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

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

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

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

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

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

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

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

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

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

вы можете использовать метод 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.')

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.