
В Python для извлечения чисел из текста используются встроенные возможности языка и библиотеки стандартного набора. Например, регулярные выражения через модуль re позволяют находить все последовательности цифр в строке с помощью шаблона r’\d+’, что подходит для целых чисел. Для работы с числами с плавающей точкой достаточно добавить символ точки: r’\d+\.?\d*’.
При обработке больших текстовых массивов важно учитывать производительность. Применение метода re.findall() обеспечивает прямой возврат списка чисел, что позволяет сразу использовать их в вычислениях без дополнительного перебора символов. Для оптимизации работы с повторяющимися шаблонами рекомендуется компилировать регулярное выражение через re.compile().
Альтернативным методом является итеративный разбор строки с проверкой символов через isdigit(). Этот подход подходит для ситуаций, когда требуется извлекать только целые числа и минимизировать зависимость от сторонних функций. При необходимости преобразования найденных чисел в тип int или float достаточно использовать встроенные функции int() и float().
Важно учитывать формат данных: отрицательные числа, числа с разделителями тысяч и научную нотацию требуют дополнительных проверок. Для универсального извлечения чисел из строки удобно комбинировать регулярные выражения с проверкой конвертации в числовой тип, чтобы избежать ошибок при некорректных входных данных.
Использование метода isdigit() для поиска целых чисел
Метод isdigit() проверяет, состоит ли строка полностью из цифр. Он возвращает True для последовательностей, содержащих только символы ‘0’–’9′, и False при наличии любых букв, пробелов или знаков.
Для извлечения целых чисел из строки удобно сначала разбить текст на элементы с помощью split() или регулярного разделителя, а затем фильтровать числа проверкой isdigit(). Например:
text = "В заказе 15 яблок и 42 апельсина"; numbers = [int(s) for s in text.split() if s.isdigit()]
В этом случае переменная numbers примет значение [15, 42].
Метод isdigit() не распознает отрицательные числа или числа с пробелами и символами разделителей, поэтому перед применением рекомендуется удалять знаки или использовать дополнительные проверки:
nums = [int(s) for s in text.replace("-", " -").split() if s.lstrip('-').isdigit()]
Такой подход корректно извлечет отрицательные значения, например -7 или -42.
Для обработки больших текстов с переменным форматированием стоит комбинировать split() и isdigit(), избегая регулярных выражений там, где нужна простая проверка целых чисел. Это снижает нагрузку на интерпретатор и повышает читаемость кода.
Метод isdigit() особенно эффективен для валидации ввода пользователя, когда необходимо убедиться, что введена корректная последовательность цифр без посторонних символов.
Регулярные выражения: поиск чисел с re.findall()
В Python библиотека re предоставляет мощный инструмент для поиска чисел в строках с помощью функции re.findall(). Этот метод возвращает все совпадения шаблона в виде списка строк.
Простейший пример извлечения целых чисел:
import re
text = "В заказе 12 яблок и 45 апельсинов."
numbers = re.findall(r'\d+', text)
print(numbers) # ['12', '45']
Объяснение шаблона:
\d– любой цифровой символ (0–9)+– один или более повторов предыдущего символа
Для чисел с плавающей точкой используют шаблон с учётом точки:
text = "Цена товара: 12.5 USD, скидка: 3.25 USD"
numbers = re.findall(r'\d+\.\d+', text)
print(numbers) # ['12.5', '3.25']
Если нужно извлечь все числа, включая целые и десятичные:
text = "Вес: 10 кг, рост: 1.75 м"
numbers = re.findall(r'\d+\.?\d*', text)
print(numbers) # ['10', '1.75']
\.?– необязательная точка\d*– ноль или более цифр после точки
Советы по оптимизации поиска:
- Используйте raw-строки
r'...', чтобы не экранировать обратные слеши. - Для отрицательных чисел добавляйте необязательный знак:
-?\d+\.?\d*. - Если нужны числа в определённом диапазоне или формате, уточняйте шаблон конкретными ограничениями.
- Для больших текстов с множеством чисел
re.finditer()может быть эффективнее, так как возвращает генератор.
Функция re.findall() позволяет быстро собирать все числа в строке, при этом гибкость регулярных выражений даёт возможность учитывать десятичные точки, знаки и специфические форматы.
Извлечение чисел с плавающей точкой через re

Для извлечения чисел с плавающей точкой из строки в Python используется модуль re. Основной подход заключается в создании регулярного выражения, которое учитывает десятичные точки и возможные знаки числа.
Пример регулярного выражения для чисел с плавающей точкой:
r'[-+]?\d*\.\d+|\d+'
Особенности данного выражения:
[-+]?– необязательный знак числа.\d*– любое количество цифр перед точкой (может быть 0).\.\d+– обязательная десятичная часть.|\d+– позволяет также извлекать целые числа.
Пример использования в Python:
import re
text = "Температура вчера была -3.5°C, а сегодня 7.25°C"
numbers = re.findall(r'[-+]?\d*\.\d+|\d+', text)
numbers = [float(num) for num in numbers]
print(numbers) # [-3.5, 7.25]
Рекомендации при работе с плавающей точкой:
- Если требуется игнорировать целые числа, используйте выражение
r'[-+]?\d*\.\d+'. - Для чисел в научной нотации добавьте шаблон
[eE][-+]?\d+к регулярному выражению. - Всегда конвертируйте строки в
floatдля дальнейших вычислений. - При анализе больших текстов используйте
re.finditerдля экономии памяти, чтобы обрабатывать числа по одному.
Пример с научной нотацией:
text = "Значение равно 1.23e-4 или -4.56E2"
numbers = re.findall(r'[-+]?\d*\.\d+(?:[eE][-+]?\d+)?', text)
numbers = [float(num) for num in numbers]
print(numbers) # [0.000123, -456.0]
Преобразование найденных строковых чисел в int и float
Строковые числа, извлечённые с помощью регулярных выражений или методов строк, необходимо конвертировать для вычислений. Для целых чисел используется int(). Пример: int('128') вернёт 128. Пробелы и нецифровые символы удаляются методами strip() и replace() перед конвертацией.
Для чисел с плавающей точкой применяется float(). Пример: float('56.78') возвращает 56.78. Если в строке используется запятая как десятичный разделитель, её заменяют на точку: '56,78'.replace(',', '.').
Массовое преобразование удобно через генераторы списков: ints = [int(x) for x in str_numbers] или через map(): floats = list(map(float, str_numbers)). Это особенно эффективно для больших массивов данных.
Для надёжности используют try-except при конвертации: try: val = int(s) except ValueError: val = None. Такой подход предотвращает ошибки при некорректных строках и сохраняет поток обработки данных.
После конвертации данные становятся пригодными для арифметических операций, агрегирования и визуализации без дополнительных преобразований.
Извлечение отрицательных чисел из текста

Для извлечения отрицательных чисел из текста в Python удобнее всего использовать регулярные выражения. Важно точно определить шаблон, чтобы учитывать как целые числа, так и числа с плавающей запятой, при этом игнорируя знаки минус, стоящие перед словами или символами.
Пример регулярного выражения для целых и дробных чисел: -?\d+(\.\d+)?. Для строго отрицательных чисел рекомендуется использовать знак минус в начале: -\d+(\.\d+)?. Такой шаблон извлекает значения вида -5, -42, -3.14 и игнорирует положительные числа и одиночный символ минус.
Пример использования в Python:
import re
text = "Температуры: -5, 3, -12.7, 0, 8"
negatives = re.findall(r'-\d+(\.\d+)?', text)
print(negatives)
Результат:
| Найденные числа |
|---|
| -5 |
| -12.7 |
Для обработки чисел внутри сложных строк, например "Баланс: -250 руб, кредит: 500 руб", рекомендуется предварительно очищать текст от символов валют и пробелов, чтобы регулярное выражение корректно распознавало отрицательные значения.
Если нужно сразу преобразовать найденные строки в числа, удобно использовать списковое включение:
negatives_numbers = [float(num) for num in re.findall(r'-\d+(\.\d+)?', text)]
Этот подход обеспечивает точное извлечение и готовность данных к вычислениям, аналитике и визуализации. Регулярные выражения легко модифицировать для других форматов чисел, включая экспоненциальную запись: -\d+(\.\d+)?(e-?\d+)?.
Работа с числами внутри сложных текстовых паттернов

Для извлечения чисел из сложных текстовых паттернов в Python оптимально использовать модуль re. Регулярные выражения позволяют точно задавать контекст чисел, учитывая наличие разделителей, символов валюты, скобок и единиц измерения.
Пример: извлечение чисел с десятичной частью и разделителями тысяч:
import re
text = "Стоимость: 1,234.56 USD, скидка: 78.90%"
numbers = re.findall(r'\d{1,3}(?:,\d{3})*(?:\.\d+)?', text)
print(numbers)
Результат: [‘1,234.56’, ‘78.90’]. Использование (?:,\d{3})* учитывает группы тысяч, а (?:\.\d+)? – дробную часть.
Для чисел с единицами измерения или текстовыми маркерами удобно использовать позитивные и негативные lookahead/lookbehind. Например, извлечение значений с «кг» после числа:
text = "Вес яблок 2.5кг, вес груш 1кг"
weights = re.findall(r'\d+(?:\.\d+)?(?=кг)', text)
print(weights)
Результат: [‘2.5’, ‘1’]. Lookahead позволяет не включать «кг» в результат.
Для сложных паттернов с диапазонами или вариантами формата удобно объединять альтернативы через |:
text = "Температура: -5°C до 12°C, влажность 45%"
values = re.findall(r'-?\d+(?:\.\d+)?(?=°C)|\d+(?=%)', text)
print(values)
Результат: [‘-5′, ’12’, ’45’]. Такой подход позволяет одновременно извлекать разные типы чисел без множественных проходов по строке.
При работе с многострочными или вложенными паттернами полезно включать флаги re.MULTILINE и re.DOTALL для расширения поиска через переносы строк и любые символы. Для последующей конвертации строк в числа стоит использовать int() или float(), предварительно очищая разделители:
clean_numbers = [float(n.replace(',', '')) for n in numbers]
Рекомендация: проектируя регулярные выражения для сложных текстов, всегда тестируйте их на реальных примерах данных, чтобы учесть возможные аномалии, такие как пробелы, отрицательные значения и смешанные форматы чисел.
Объединение нескольких методов для разных типов чисел
Для извлечения целых и дробных чисел из одной строки в Python эффективно комбинировать регулярные выражения и методы строк. Например, регулярка r'-?\d+\.\d+|-?\d+' позволяет найти как целые, так и десятичные числа, включая отрицательные значения.
После применения re.findall полученный список можно преобразовать в соответствующие типы данных: числа с точкой конвертировать в float, остальные в int. Использование условного выражения или функции try-except обеспечивает корректное определение типа без потери данных.
Если строка содержит числа с разными разделителями десятичной части, например «3,14» вместо «3.14», предварительная замена str.replace(',', '.') упрощает работу регулярного выражения и позволяет стандартизировать данные перед конвертацией.
Для больших текстов стоит использовать генераторные выражения: (float(x) if '.' in x else int(x) for x in re.findall(pattern, text)). Это снижает потребление памяти и ускоряет обработку, одновременно объединяя извлечение и преобразование чисел.
При работе с финансовыми или научными данными можно дополнительно использовать decimal.Decimal для чисел с плавающей точкой, сохраняя точность после объединения методов. Комбинированный подход обеспечивает точное извлечение всех типов чисел из одного источника без повторного анализа строки.
Вопрос-ответ:
Как можно извлечь все числа из строки в Python без использования сторонних библиотек?
В Python это можно сделать с помощью встроенных средств, например, метода split() для разделения строки и проверки каждого элемента на цифры с помощью isdigit(). Такой способ подойдет для простых случаев, когда числа отделены пробелами или другими разделителями. Для более сложных строк, где числа могут быть смешаны с буквами, лучше использовать регулярные выражения из модуля re, позволяющие находить последовательности цифр в любом месте текста.
Можно ли извлекать как целые числа, так и дробные из одной строки?
Да, это возможно. С помощью регулярных выражений можно составить шаблон, который будет учитывать наличие десятичной точки или запятой, например, паттерн r’\d+\.?\d*’. Он найдет и целые числа, и дробные, включая числа с плавающей точкой. После этого результат можно преобразовать в тип int или float в зависимости от формата числа.
Что делать, если в строке числа записаны через пробел и через запятую одновременно?
В таких случаях регулярные выражения позволяют указать несколько возможных разделителей. Например, можно использовать паттерн r’\d+’ вместе с методом re.split(), передав список разделителей через символ ‘|’. Это позволит корректно разделять числа, независимо от того, идут ли они через пробел, запятую или точку с запятой.
Как извлечь числа из строки и сразу получить их в виде списка целых чисел?
После того как регулярное выражение найдет все числовые последовательности в строке с помощью re.findall(), результат будет списком строк. Чтобы преобразовать их в числа, можно применить функцию int() к каждому элементу через генератор списка. Например: nums = [int(x) for x in re.findall(r’\d+’, text)]. Это позволит получить готовый список целых чисел для дальнейших вычислений.
Можно ли извлекать отрицательные числа из строки вместе с положительными?
Да, это возможно, если в шаблоне регулярного выражения учитывать знак минус перед числом. Например, паттерн r’-?\d+’ найдет как положительные, так и отрицательные целые числа. Если нужны также отрицательные дробные, можно расширить паттерн до r’-?\d+\.?\d*’. После извлечения чисел строки можно преобразовать в int или float, чтобы использовать их в вычислениях.
