Числа из текстовых строк 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']