Проверьте, содержит ли строка число
Большинство вопросов, которые я нашел, смещены на тот факт, что они ищут буквы в своих числах, в то время как я ищу цифры в том, что я хотел бы быть бесчисленной строкой. Мне нужно ввести строку и проверить, содержит ли она какие-либо числа и отклоняет ли она.
Функция 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
>>>
Пара моментов об этой реализации.
-
any
них лучше, потому что она работает как выражение короткого замыкания в языке Си и будет возвращать результат, как только его можно будет определить, т.е. в случае строки 'a1bbbbbbc' 'b и' c даже не будут сравниваться.
-
ord
лучше, потому что он обеспечивает большую гибкость, например, контрольные числа только между "0" и "5" или любым другим диапазоном. Например, если вы хотите написать валидатор для шестнадцатеричного представления чисел, вы бы хотели, чтобы строка имела алфавиты только в диапазоне от "A" до "F".