Числа из текстовых строк Python: извлечение и преобразование данных

Раздел: Строки -> Обработка строк

Основные подходы к извлечению чисел из строки

Наиболее эффективный способ извлечения чисел из строки - использование регулярных выражений модуля re. Универсальное выражение для целых и чисел с плавающей точкой (включая отрицательные): r'-?\d+(?:\.\d+)?'. Пример:


import re
s = "Температура -5.5°C, давление 1013 гПа, высота 0.8 км"
numbers = re.findall(r'-?\d+(?:\.\d+)?', s)
print(numbers)

заменить символ на другой python (замена символа в строке на python)

['-5.5', '1013', '0.8']

Strip строки python (метод strip для строк в python)

Этот метод работает для большинства стандартных представлений чисел. Он возвращает список строк, которые затем можно преобразовать в float или int.

Типичные ошибки:

  • Выражение не захватывает числа в научной нотации (1e5).
  • Если строка содержит числа с запятой как десятичный разделитель (3,14), выражение не сработает - нужно заменять запятую на точку.
  • Числа с пробелами внутри (1 000) не будут распознаны.

Решение проблем:

  • Для научной нотации: r'-?\d+(?:\.\d+)?[eE][+-]?\d+' или комбинировать с основным паттерном.
  • Для запятой: предварительная замена s.replace(',', '.').
  • Для пробелов: удаление пробелов внутри числа или использование более сложного паттерна.

Как извлечь только целые числа из строки?

Используйте паттерн r'\d+'. Он найдет последовательности цифр. Пример:

re.findall(r'\d+', "abc123def456")

сколько чисел в строке python (подсчёт количества чисел в строке в python)

['123', '456']

Python знак в строке (проверка наличия символа в строке python)

Проблема: числа с десятичной частью будут разбиты на два целых (например, "3.14" -> ['3', '14']).

Чтобы избежать этого, используйте паттерн для чисел с плавающей точкой.

Как извлечь числа с плавающей точкой (включая целые)?

Паттерн r'\d+\.\d+|\d+' сначала ищет числа с точкой, затем целые. Или компактнее r'\d+(?:\.\d+)?'. Пример с отрицательными: r'-?\d+(?:\.\d+)?'. Пример кода:

re.findall(r'\d+\.\d+|\d+', "цена 99.99 руб, вес 10 кг")

сколько символов в строке python (подсчет количества символов в строке в python)

['99.99', '10']

Python убрать пробелы (удаление пробелов из строки в python)

Важно: если в строке есть точки, не являющиеся десятичным разделителем (например, IP-адрес 192.168.1.1), паттерн может захватить лишнее. Для таких случаев требуется более точное регулярное выражение.

Как извлечь числа из строки, не используя регулярные выражения?

Можно разбить строку на слова методом split() и проверить каждое слово методом isdigit() или попытаться преобразовать в число. Это подходит для простых случаев, когда числа отделены пробелами. Пример:

s = "У меня 2 яблока и 3 груши"
words = s.split()
numbers = [word for word in words if word.isdigit()]
print(numbers)

числа в строке python задача (задача: числа в строке в python)

['2', '3']

Python количество слов (подсчет количества слов в python)

Этот метод не распознает отрицательные числа или числа с плавающей точкой. Для них нужна попытка преобразования:

def extract_numbers(s):
    words = s.split()
    result = []
    for w in words:
        try:
            num = float(w)
            result.append(w)
        except ValueError:
            pass
    return result
print(extract_numbers("Температура -5.5°C, давление 1013"))

Python слово в строке (поиск слова в строке python)

['-5.5', '1013']

разделить слово python (разделение строки на слова в python)

Проблема: преобразование в float может дать нежелательный результат при наличии нечисловых символов, прикрепленных к числу (например, "-5.5°C" не преобразуется). В таких случаях требуется предварительная очистка строки.

Решение: использовать регулярные выражения для выделения чисел и затем преобразовывать.

Как обработать числа с разделителями (CSV, логи)?

Если числа разделены запятыми или другими символами, используем split() с конкретным разделителем, затем фильтрацию. Пример:

line = "10,20,30,abc,40"
parts = line.split(',')
numbers = [p for p in parts if p.isdigit()]
print(numbers)
['10', '20', '30', '40']

Для чисел с плавающей точкой или отрицательных - комбинируем с try/except.

Ошибка: если в строке используются пробелы после разделителя ("10, 20"), то split оставит пробел перед числом, и isdigit вернет False. Решение: удалять лишние пробелы: p.strip().isdigit().

Как извлечь числа из строки с научной нотацией?

Для чисел в формате 1.23e4 или 5E-10 используйте паттерн: r'[+-]?\d+(?:\.\d+)?[eE][+-]?\d+'. Комбинированный паттерн для любых чисел:

pattern = r'[+-]?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?'
re.findall(pattern, "Значение 1.5e-3 и 2E10")
['1.5e-3', '2E10']

Проблема: иногда запись вида .5 (без целой части) не захватывается. Добавьте альтернативу: r'(?:[+-]?\d+(?:\.\d+)?|[+-]?\.\d+)(?:[eE][+-]?\d+)?'.

Расширенные примеры извлечения чисел

В этом разделе приведены дополнительные, менее распространенные ситуации.

Пример 1. Извлечение чисел с научной нотацией и разными форматами.

Пример

import re
text = "Расстояние 1.5e-3 мм, масса 2.5E+02 кг, заряд 1.602e-19 Кл"
pat = r'[+-]?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?'
print(re.findall(pat, text))
['1.5e-3', '2.5E+02', '1.602e-19']

Пример 2. Извлечение чисел с плавающей точкой, где дробная часть отделена запятой (европейский стандарт). Сначала замените запятую на точку.

Пример

text = "Температура 36,6 °C, высота 1 234,56 м"
text_normalized = text.replace(',', '.').replace(' ', '')  # удаляем пробелы
# Теперь извлекаем числа
pat = r'-?\d+(?:\.\d+)?'
print(re.findall(pat, text_normalized))
['36.6', '1234.56']

Пример 3. Извлечение чисел с указанием позиций в строке (для дальнейшего редактирования).

Пример

import re
text = "Код 404: страница не найдена; ошибка 500"
for match in re.finditer(r'\d+', text):
    print(f"Число {match.group()} на позиции {match.start()}-{match.end()}")
Число 404 на позиции 4-7
Число 500 на позиции 36-39

Пример 4. Использование pandas для извлечения чисел из колонки с текстом.

Пример

import pandas as pd
df = pd.DataFrame({'data': ['Отпуск 10 дней', 'Зарплата 50000 руб', 'Бонус 1500.50']})
df['numbers'] = df['data'].str.extractall(r'(\d+(?:\.\d+)?)').groupby(level=0).agg(list)
print(df)
                 data    numbers
0         Отпуск 10 дней      [10]
1   Зарплата 50000 руб   [50000]
2     Бонус 1500.50  [1500.50]

Пример 5. Различие между isdigit, isnumeric и isdecimal.

Пример

s1 = "123"
s2 = "⅓"  # символ дроби
s3 = "²"   # надстрочный знак
print(s1.isdigit(), s1.isnumeric(), s1.isdecimal())
print(s2.isdigit(), s2.isnumeric(), s2.isdecimal())
print(s3.isdigit(), s3.isnumeric(), s3.isdecimal())
True True True
False True False
True True False

Пример 6. Преобразование строки с числами в список int с помощью list comprehension и try/except.

Пример

line = "10 20 abc 30"
numbers = [int(x) for x in line.split() if x.isdigit()]
print(numbers)
[10, 20, 30]

Пример 7. Использование ast.literal_eval для строкового представления числа.

Пример

import ast
s = "-3.14e2"
try:
    val = ast.literal_eval(s)
    print(val, type(val))
except ValueError:
    print("Не число")
-314.0 

Пример 8. Извлечение IP-адресов (состоят из 4 чисел, разделенных точками).

Пример

import re
text = "Мой IP: 192.168.1.1, шлюз 10.0.0.1"
ip_pat = r'\b(?:\d{1,3}\.){3}\d{1,3}\b'
print(re.findall(ip_pat, text))
['192.168.1.1', '10.0.0.1']

Пример 9. Извлечение чисел из логов (например, Apache).

Пример

log = "192.168.1.1 - - [10/Oct/2023:13:55:36 +0000] \"GET /index.html HTTP/1.1\" 200 2326"
# Извлечь код ответа (200) и размер (2326)
numbers = re.findall(r'\b\d+\b', log)
print(numbers)
['192', '168', '1', '1', '10', '2023', '13', '55', '36', '200', '2326']

Для точного извлечения нужных полей требуется более специфичное регулярное выражение.

Пример 10. Обработка чисел с ведущими нулями (например, 007). При преобразовании в int ведущие нули не влияют, но при сохранении строкового представления важно решить, нужны ли они. Регулярное выражение r'0*\d+' сохраняет количество цифр.

Пример

import re
text = "Коды: 007, 008, 100"
print(re.findall(r'\d+', text))
['007', '008', '100']

Задача: числа в строке в Python - comments

En
числа в строке python задача (python)