Извлечение числовых данных из строк — распространенная задача в программировании на Python, особенно при очистке данных и веб-скрапинге. В этой статье рассматриваются несколько эффективных и универсальных методов для достижения этого, подходящих для различных сценариев и уровней сложности.
Содержание
- Метод 1: Использование регулярных выражений
- Метод 2: Использование list comprehension
- Метод 3: Сочетание
filter
иisdigit()
- Метод 4: Расширенные регулярные выражения для сложных шаблонов
- Обработка вариаций в числовых форматах
- Заключение
Метод 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
. Однако для надежности и обработки разнообразных числовых форматов регулярные выражения незаменимы.