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

Простой подход к проверке того, содержит ли строка 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.

Какой ваш любимый способ? Предлагаете ли вы какие-либо другие подходы?

Дайте мне знать в комментариях ниже 🙂

Автор

Фото аватара

Владимир Михайлов

Программист на Python с большим количеством опыта и разнообразных проектов.