Простой подход к проверке того, содержит ли строка Python число, заключается в проверке каждого символа в строке с помощью метода строки isdigit()
. После этого мы получаем список булевых значений, и если какой-либо из его элементов равен True
, это означает, что строка содержит хотя бы одно число.
Есть несколько способов решения этой проблемы, и в этом уроке мы рассмотрим некоторые из них.
Давайте начнем!
Использование цикла for и isdigit() для определения, содержит ли строка числа
Базовый подход к этой проверке — использование цикла for, который проходит по каждому символу строки и проверяет, является ли этот символ числом, с помощью метода строки isdigit()
.
Если хотя бы один символ является цифрой, то возвращается True, в противном случае — False.
Напишем функцию для реализации этой логики:
def contains_number(value):
for character in value:
if character.isdigit():
return True
return False
Выполнение функции останавливается, как только в строке будет найдено первое число или после выполнения цикла, если не найдено ни одного числа.
Давайте применим эту функцию к некоторым строкам и посмотрим, как она работает:
>>> print(contains_number('1s4f6h'))
True
>>> print(contains_number('python'))
False
>>> print(contains_number('python3'))
True
Он выполняет свою работу!
Использование isdigit() и списочного генератора для проверки того, содержит ли строка число
Другой способ проверить, содержит ли строка Python число, — использовать метод строки isdigit()
вместе с генератором списков.
Давайте сначала вспомним, как работает метод isdigit:
>>> '123'.isdigit()
True
>>> '1'.isdigit()
True
>>> 'a'.isdigit()
False
>>> 'a1'.isdigit()
False
>>> ''.isdigit()
False
Давайте возьмем строку и применим isdigit() к каждому символу строки:
>>> value = 'adf2'
>>> [character.isdigit() for character in value]
[False, False, False, True]
Мы использовали списочное включение, которое генерирует список логических значений, в котором каждый элемент представляет собой значение, возвращаемое функцией isdigit()
для каждого символа в строке.
Итак, что мы можем сделать с этим списком?
Мы можем проверить, есть ли в этом списке логическое значение True
. Это покажет, что строка содержит хотя бы одно число.
Для этого мы можем использовать оператор if-else:
>>> if True in [character.isdigit() for character in value]:
… print("The string contains a number")
… else:
… print("The string doesn't contain a number")
…
The string contains a number
Давайте создадим функцию, которая объединит все, что мы видели до сих пор.
Оператор if
используется для возврата True
, если строка содержит хотя бы одно число. В противном случае возвращается False
.
def contains_number(value):
if True in [character.isdigit() for character in value]:
return True
return False
Вот что возвращает функция, когда мы передаем ей несколько строк:
>>> print(contains_number(''))
False
>>> print(contains_number('awirfd'))
False
>>> print(contains_number('dfgh3'))
True
>>> print(contains_number('12345'))
True
Вывод нашей функции выглядит хорошо.
Использование функции Any() для проверки того, содержит ли строка число
Мы можем начать с кода, который мы создали в предыдущем разделе, и заменить оператор if
чем-то другим…
… встроенная функция Python any()
, имеющая следующий синтаксис:
any(iterable)
Функция any() возвращает True, если любой из элементов в итерируемом является True, в противном случае она возвращает False. Функция также возвращает False, если итерируемый объект пуст.
Это означает, что мы можем передать список логических значений, сгенерированных в предыдущем разделе, в функцию any()
и удалить оператор if
, использованный ранее:
def contains_number(value):
return any([character.isdigit() for character in value])
Как видите, мы передали функцию Python any() для работы со списком.
Это вывод нашей функции, когда мы передаем ей те же строки, которые были протестированы в предыдущем разделе:
>>> print(contains_number(''))
False
>>> print(contains_number('awirfd'))
False
>>> print(contains_number('dfgh3'))
True
>>> print(contains_number('12345'))
True
Проверка наличия чисел в строке Python с помощью регулярного выражения
Другой способ узнать, является ли число частью строки, — использовать регулярные выражения Python.
Имя модуля Python для обработки регулярных выражений — re.
Во-первых, давайте придумаем регулярное выражение, которое мы можем использовать для обнаружения любых чисел в строке. Для этого мы можем использовать функцию re.findall()
:
re.findall(pattern, string)
Первый аргумент, который мы передаем re.findall
, — это шаблон, который мы ищем.
Для поиска более одного числа мы можем использовать '[0-9]+'
.
Вторым аргументом является строка, в которой мы ищем определенный шаблон.
Вот вывод этого регулярного выражения, примененного к нескольким строкам:
>>> print(re.findall('[0-9]+', ''))
[]
>>> print(re.findall('[0-9]+', 'awirfd'))
[]
>>> print(re.findall('[0-9]+', 'dfgh3'))
['3']
>>> print(re.findall('[0-9]+', '12345'))
['12345']
>>> print(re.findall('[0-9]+', '12az3dr45'))
['12', '3', '45']
Мы можем обновить нашу функцию, вызвав re.findall()
и проверив, является ли полученный список пустым или нет.
Если полученный список не пуст, то строка содержит хотя бы одно число. Мы также можем использовать тот факт, что в Python пустые последовательности являются ложными.
import re
def contains_number(value):
numbers = re.findall('[0-9]+', value)
return True if numbers else False
Оператор return этой функции использует тернарный оператор Python для возврата True или False в зависимости от того, является ли список чисел пустым или нет.
Другой вариант — использовать функцию bool()
для преобразования списка, возвращаемого функцией re.findall()
, в логическое значение:
import re
def contains_number(value):
return bool(re.findall('[0-9]+', value))
Давайте применим эту функцию к нескольким строкам, чтобы убедиться, что она работает так, как и ожидалось:
>>> print(contains_number(''))
False
>>> print(contains_number('awirfd'))
False
>>> print(contains_number('dfgh3'))
True
>>> print(contains_number('12345'))
True
>>> print(contains_number('12as34rt5'))
True
Как проверить, содержит ли строка число, используя функцию Map?
Вот еще один способ узнать, есть ли в вашей строке цифры.
На этот раз мы будем использовать функцию map()
, которая применяет определенную функцию к элементам итерируемого объекта (строка является итерируемым объектом, потому что ее можно рассматривать как последовательность символов).
Если мы передадим функцию isdigit()
и строку в функцию map
, мы получим обратно объект map
.
>>> map(str.isdigit, '12r45')
<map object at 0x7f9e88295190>
Что мы можем с этим сделать?
Мы можем использовать функцию list()
, чтобы преобразовать его в список Python:
>>> list(map(str.isdigit, '12r45'))
[True, True, False, True, True]
Как вы можете видеть из вывода выше, мы получаем список булевых значений, где каждое булево значение связано с символом в строке. Булево значение равно True, если символ является числом, и False в противном случае.
Затем мы можем использовать функцию any()
, уже использованную в одном из предыдущих разделов, чтобы узнать, содержит ли список хотя бы один элемент True.
>>> any(map(str.isdigit, '12r45'))
True
>>> any(map(str.isdigit, 'etdgr'))
False
Заключение
Мы рассмотрели несколько способов, чтобы узнать, содержит ли строка Python число.
Вы узнали, как использовать метод строки isdigit()
, функцию any()
, регулярные выражения и функцию map
.
Какой ваш любимый способ? Предлагаете ли вы какие-либо другие подходы?
Дайте мне знать в комментариях ниже 🙂