
В Python извлечение чисел из строки – одна из частых задач, которая может быть решена различными способами. Основным инструментом для выполнения этой задачи является модуль re, предоставляющий поддержку регулярных выражений. Регулярные выражения позволяют эффективно находить паттерны, в том числе числовые значения, в строках любого формата.
Для начала стоит отметить, что число может быть представлено как целым числом, так и с плавающей запятой, а также с различными разделителями, такими как запятая или точка. Именно поэтому регулярные выражения, используемые для поиска чисел, должны учитывать все эти возможные вариации. Например, для извлечения всех целых чисел из строки можно использовать выражение \d+, где \d означает цифры, а + указывает на их количество.
Когда речь идет о работе с числами с плавающей запятой, ситуация становится чуть сложнее. Здесь может понадобиться использовать более сложное регулярное выражение, которое будет учитывать точку или запятую в качестве разделителя. Также стоит быть внимательным к числам с отрицательными знаками, так как они могут потребовать дополнительной обработки в выражении. Один из вариантов такого регулярного выражения: [-+]?\d*\.?\d+, где [-+] позволяет учесть знак числа, а \d*\.?\d+ – цифры и десятичную точку.
Следует помнить, что помимо стандартных способов извлечения чисел, Python предоставляет и другие методы, такие как использование встроенных функций, например, int() или float() для преобразования строк в числа. Однако для извлечения всех чисел из строки, особенно в случае, когда их расположение непредсказуемо, регулярные выражения предоставляют наибольшую гибкость и удобство.
Использование регулярных выражений для извлечения чисел

Для поиска целых чисел можно использовать простое регулярное выражение \d+, где \d обозначает любую цифру, а + указывает на то, что должно быть одно или больше таких символов подряд. Пример:
import re
text = "Пример 123 и 4567 чисел."
numbers = re.findall(r'\d+', text)
Это выражение извлечет все целые числа в строке. Если нужно найти отрицательные числа, можно использовать выражение -?\d+, где -? означает, что знак минус может быть или не быть перед числом.
text = "Отрицательное число -100 и положительное 50."
numbers = re.findall(r'-?\d+', text)
Если требуется извлечь числа с плавающей точкой, регулярное выражение будет немного сложнее. Пример выражения для поиска чисел с точкой – -?\d+\.\d+. Оно извлекает как положительные, так и отрицательные числа с десятичной точкой:
text = "Цены: -12.34, 56.78, 90."
numbers = re.findall(r'-?\d+\.\d+', text)
Для обработки чисел в экспоненциальной форме можно использовать выражение -?\d+(\.\d+)?[eE][-+]?\d+, которое захватывает числа вида 1e3 или -5.67E-2:
text = "Экспоненциальные числа: 1e3, -5.67E-2."
numbers = re.findall(r'-?\d+(\.\d+)?[eE][-+]?\d+', text)
Важно помнить, что регулярные выражения в Python чувствительны к контексту, и использование слишком общих выражений может привести к ошибкам. Всегда старайтесь тестировать свои регулярные выражения на различных входных данных, чтобы избежать некорректных извлечений.
Метод split() для разделения строки и извлечения чисел

Метод split() в Python позволяет разделить строку на части по заданному разделителю. Это полезный инструмент, когда необходимо извлечь числа из строки, содержащей текст и цифры. Метод разбивает строку на подстроки, которые можно затем анализировать и использовать.
По умолчанию split() разделяет строку по пробелу, но можно указать любой другой символ или регулярное выражение в качестве разделителя. Это позволяет легко извлечь числа, если они разделены фиксированным символом, например, запятой или точкой с запятой.
Пример простого использования split() для извлечения чисел из строки:
text = "Найдите 15 чисел 25 и 40 в этом тексте"
numbers = [int(word) for word in text.split() if word.isdigit()]
print(numbers)
Этот код разбивает строку на слова, и если слово представляет собой число, оно конвертируется в целое значение. Это один из самых простых способов извлечь числа, если они представлены отдельными словами.
Если числа разделены другими символами, например, запятой или точкой, можно использовать дополнительный параметр метода split(). Например:
text = "1, 2, 3, 4, 5"
numbers = [int(num) for num in text.split(",")]
print(numbers)
Метод split() также полезен при извлечении чисел из более сложных строк. Если, например, числа могут быть частью слова или содержать разделители, можно предварительно обработать строку с помощью регулярных выражений для выделения чисел, а затем применить split() для дальнейшего анализа.
Для более сложных случаев извлечения чисел рекомендуется комбинировать split() с регулярными выражениями. Это даст больше гибкости при работе с разнообразными форматами строк.
Поиск чисел с помощью метода findall из модуля re
Метод findall() из модуля re позволяет извлекать все совпадения шаблона из строки. Чтобы найти числа, используется регулярное выражение r'\d+', где \d+ обозначает последовательность одной или более цифр.
Пример:
import re
text = "Уровень: 42%, температура: 23C, ID: 007"
numbers = re.findall(r'\d+', text)
print(numbers) # ['42', '23', '007']
Результат – список строк, соответствующих найденным числам. Для преобразования их в целые числа используйте map(int, ...):
numbers = list(map(int, re.findall(r'\d+', text)))
print(numbers) # [42, 23, 7]
Чтобы извлекать только числа, окружённые пробелами или символами пунктуации, используйте шаблон r'\b\d+\b'. Это исключает части слов и смешанные значения, например, в model123 число не будет найдено.
Если необходимо извлечь числа с плавающей точкой, шаблон меняется на r'\d+\.\d+' или r'\d+(?:\.\d+)?', чтобы охватить как целые, так и вещественные числа:
text = "Вес: 70.5 кг, рост: 180"
numbers = re.findall(r'\d+(?:\.\d+)?', text)
print(numbers) # ['70.5', '180']
Метод findall() работает быстрее, чем последовательный перебор символов, и должен использоваться при массовой обработке текста. Для повышения читаемости и повторного использования шаблоны лучше выносить в отдельные переменные.
Как извлечь только целые числа из строки
Для извлечения целых чисел из строки используйте регулярные выражения с шаблоном r'\b\d+\b'. Он находит группы цифр, отделённые от других символов границами слова, исключая дробные и отрицательные значения.
- Импорт модуля:
import re - Пример строки:
"Цена: 150 рублей, скидка 20%, артикул 123-456" - Поиск чисел:
re.findall(r'\b\d+\b', строка)
Если нужны также отрицательные числа, модифицируйте шаблон: r'\b-?\d+\b'. Однако этот шаблон не находит числа, примыкающие к буквам (например, в «A123B»), так как отсутствует граница слова между цифрами и буквами.
Для извлечения всех целых чисел, включая те, что слиты с буквами, используйте:
re.findall(r'-?\d+', строка)– находит любые последовательности цифр, включая отрицательныеmap(int, ...)– приводит найденные строки к типуint
Пример полного кода:
import re
строка = "Температура -12 градусов, высота 3000м, ID: A123B456"
числа = list(map(int, re.findall(r'-?\d+', строка)))
print(числа) # [-12, 3000, 123, 456]
Для исключения повторов и контроля над результатом применяйте set() или фильтрацию по условиям.
Работа с дробными числами в строках

Для извлечения дробных чисел из строки применяют регулярные выражения, учитывающие как точку, так и запятую в качестве десятичного разделителя. Пример выражения для поиска: r'[-+]?\d+[.,]?\d*'. Оно находит положительные и отрицательные значения, включая целые и дробные.
После извлечения строки необходимо привести числа к единому формату. Для корректного преобразования в float следует заменить запятую на точку:
import re
text = "Цена: 12.5$, скидка: -3,25%, налог: +0.75"
matches = re.findall(r'[-+]?\d+[.,]?\d*', text)
numbers = [float(x.replace(',', '.')) for x in matches]
print(numbers) # [12.5, -3.25, 0.75]
Чтобы исключить числа с несколькими разделителями или некорректные значения, используйте более строгий шаблон: r'[-+]?\d+(?:[.,]\d+)?'. Это выражение предотвращает извлечение обрезанных значений вроде '12..5' или '3,2.1'.
Если требуется извлекать только дробные (нецелые) значения, исключая целые, добавьте проверку на наличие десятичной части:
matches = re.findall(r'[-+]?\d+[.,]\d+', text)
Для поддержки чисел в научной нотации (например, 1.23e-4) используйте выражение: r'[-+]?\d+(?:[.,]\d+)?(?:[eE][-+]?\d+)?'.
Преобразование извлечённых чисел в целочисленный или вещественный формат

После извлечения чисел из строки, например с помощью регулярных выражений, они представлены в виде строк. Для последующей обработки важно преобразовать их в числовые типы – int или float – в зависимости от содержания.
Если предполагается, что все числа являются целыми, используйте int():
nums = re.findall(r'\d+', text)
ints = [int(n) for n in nums]
Для извлечения чисел с плавающей точкой применяйте выражение r'\d+\.\d+' или комбинированное r'\d+(?:\.\d+)?'. Результат преобразуется через float():
nums = re.findall(r'\d+(?:\.\d+)?', text)
floats = [float(n) for n in nums]
При смешанном содержании (целые и вещественные числа) сначала определяйте тип через проверку наличия точки:
nums = re.findall(r'\d+(?:\.\d+)?', text)
converted = [float(n) if '.' in n else int(n) for n in nums]
При необходимости обработки отрицательных чисел используйте выражение r'-?\d+(?:\.\d+)?'. Оно корректно извлекает как отрицательные, так и положительные значения:
nums = re.findall(r'-?\d+(?:\.\d+)?', text)
converted = [float(n) if '.' in n else int(n) for n in nums]
Если есть риск получить значения, не поддающиеся преобразованию (например, некорректный ввод), оборачивайте преобразование в try-except:
result = []
for n in re.findall(r'-?\d+(?:\.\d+)?', text):
try:
result.append(float(n) if '.' in n else int(n))
except ValueError:
continue
