Python Programming

Эффективное извлечение чисел из строк в Python

Spread the love

Извлечение числовых данных из строк — распространенная задача в программировании на Python, особенно при очистке данных и веб-скрапинге. В этой статье рассматриваются несколько эффективных и универсальных методов для достижения этого, подходящих для различных сценариев и уровней сложности.

Содержание

Метод 1: Использование регулярных выражений

Регулярные выражения (regex) предлагают мощный и гибкий подход, особенно для сложных строковых структур. Модуль re Python облегчает этот процесс.


import re

def extract_numbers_regex(text):
  """Извлекает числа из строки с помощью регулярных выражений."""
  numbers = re.findall(r'-?d+(.d+)?', text)  # Соответствует целым и десятичным числам, включая отрицательные
  return [float(num) for num in numbers]

text = "There are -12 apples and 3.14 oranges, and also 12345."
numbers = extract_numbers_regex(text)
print(numbers)  # Вывод: [-12.0, 3.14, 12345.0]

Это улучшенное regex r'-?d+(.d+)?' эффективно обрабатывает отрицательные числа и десятичные дроби.

Метод 2: Использование List Comprehension

List comprehension обеспечивает краткое и питоническое решение, идеально подходящее для более простых сценариев, где числа четко выделены.


def extract_numbers_list_comprehension(text):
  """Извлекает целые числа из строки с помощью list comprehension."""
  return [int(c) for c in text if c.isdigit()]

text = "123abc456"
numbers = extract_numbers_list_comprehension(text)
print(numbers)  # Вывод: [1, 2, 3, 4, 5, 6]

Этот метод эффективен для извлечения отдельных цифр, но может не подходить для многозначных чисел или чисел с десятичными разделителями.

Метод 3: Сочетание filter и isdigit()

Этот функциональный подход использует filter() и isdigit() для получения четкого и читаемого решения, подходящего для более простых случаев.


def extract_numbers_filter(text):
  """Извлекает целые числа из строки с помощью filter и isdigit()."""
  numbers = list(filter(str.isdigit, text))
  return [int(num) for num in numbers]

text = "1a2b3c4d5"
numbers = extract_numbers_filter(text)
print(numbers) #Вывод: [1, 2, 3, 4, 5]

Подобно list comprehension, этот метод извлекает отдельные цифры и не обрабатывает более сложные числовые форматы.

Метод 4: Расширенные регулярные выражения для сложных шаблонов

Регулярные выражения действительно блещут при обработке сложных шаблонов, таких как числа в научной нотации или с разделителями тысяч.


import re

def extract_numbers_complex(text):
    """Извлекает числа (включая научную нотацию) из строки с помощью regex."""
    numbers = re.findall(r'-?d+(?:,d{3})*(?:.d+)?(?:[eE][+-]?d+)?', text)
    return [float(num.replace(',', '')) for num in numbers]

text = "The price is $1,234.56 and the quantity is 1.23e-5. Another price is 100,000"
numbers = extract_numbers_complex(text)
print(numbers) # Вывод: ['1234.56', '1.23e-5', '100000']

Это regex обрабатывает запятые как разделители тысяч и научную нотацию. replace(',', '') удаляет запятые перед преобразованием в float.

Обработка вариаций в числовых форматах

Для адаптации к различным форматам, рассмотрите следующие моменты:

  • Отрицательные числа: Включите -? в начале шаблона вашего regex (например, r'-?d+').
  • Научная нотация: Добавьте (?:[eE][+-]?d+)? для обработки экспонент (как показано в Методе 4).
  • Разделители тысяч: Используйте (?:,d{3})* для соответствия необязательным разделителям тысяч (как показано в Методе 4).
  • Символы валюты: Предварительно обработайте вашу строку, чтобы удалить символы валюты перед извлечением, или используйте более сложное regex.

Заключение

Оптимальный метод зависит от сложности ваших входных строк и желаемой точности. Для простых случаев может быть достаточно list comprehension или filter. Однако для надежности и обработки разнообразных числовых форматов регулярные выражения незаменимы.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *