проверьте, содержит ли строка число
большинство вопросов, которые я нашел, предвзяты на том, что они ищут Буквы в своих числах, тогда как я ищу числа в том, что я хотел бы быть бесчисленной строкой.
Мне нужно ввести строку и проверить, содержит ли она какие-либо числа, и если она отклоняет его.
функция isdigit () возвращает true только в том случае, если все символы являются числами. Я просто хочу, чтобы увидеть, если пользователь ввел число, так как
"У меня есть 1 собака" или что-то.
какие идеи?
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возвращает alist, которая ломает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