Преобразование CamelCase в snake_case в Python: функция
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для конвертации имён, написанных в формате CamelCase, примените следующий код, действующий на основе регулярных выражений (regex):
import re
def camel_to_snake(name):
return re.sub(r'(?<!^)(?=[A-Z])', '_', name).lower()
# Пример применения:
print(camel_to_snake('NoMoreCamel')) # no_more_camel
Здесь метод re.sub()
используется для вставки подчёркивания перед каждой заглавной буквой, не являющейся первым символом строки, а затем все символы строки переводятся в нижний регистр с помощью .lower()
.
Заглянем под капот regex: работа с библиотеками и особые случаи
Преобразование строк с помощью библиотеки inflection
Библиотека inflection
прекрасно справляется с преобразованием строк из формата CamelCase в формат snake_case без необходимости вручную писать код:
import inflection
print(inflection.underscore('CamelCaseAutomagic')) # camel_case_automagic
Иногда лучше использовать готовые решения, чем тратить время на изобретение велосипеда!
Работа со строками, содержащими ЗАГЛАВНЫЕ буквы и цифры
Строки, включающие только заглавные буквы или цифры, могут усложнить процесс. Воспользуемся улучшенным шаблоном для их обработки:
def camel_to_snake_advanced(name):
name = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name)
return re.sub('([a-z0-9])([A-Z])', r'\1_\2', name).lower()
print(camel_to_snake_advanced('OMGThisIs911')) # omg_this_is_911
Будем внимательнее: заглавные буквы на горизонте!
Используем библиотеку stringcase
для простых конвертаций
Ещё одна очень удобная библиотека, stringcase
, позволяет быстро преобразовывать строки из формата CamelCase в snake_case:
import stringcase
print(stringcase.snakecase('CamelCaseOnSteroids')) # camel_case_on_steroids
Какой же Python без его понятности и легкости!
Удаление нежелательных подчёркиваний при помощи lstrip
Иногда при преобразовании может появляться лишнее подчёркивание в начале строки. Метод lstrip
поможет нам избавиться от него:
converted = '_pesky_leading_underscore'.lstrip('_') # 'pesky_leading_underscore'
До свидания, нежелательные подчёркивания!
Python-стиль: соединяем изящную логику и практическую эффективность
Генераторы списков в сочетании с методом join
Посмотрите, как изящно можно использовать генератор списка и метод join
для решения нашей задачи:
def camel_to_snake_pythonic(name):
return ''.join(['_' + i.lower() if i.isupper() else i for i in name]).lstrip('_')
print(camel_to_snake_pythonic('ThisOneIsFun')) # this_one_is_fun
Как мудро вина стареют, так со временем улучшаются pythonic-решения! 🍷
Предварительная компиляция regex для увеличения производительности
Когда каждая миллисекунда на счету, предварительно скомпилированные регулярные выражения могут сыграть ключевую роль:
pattern = re.compile(r'(?<!^)(?=[A-Z])')
def camel_to_snake_precompiled(name, _pattern=pattern):
return _pattern.sub('_', name).lower()
print(camel_to_snake_precompiled('FastAndFurious')) # fast_and_furious
С помощью прекомпиляции мы ускоряем наш код до скорости света!
Визуализация
Представьте себе строки как поезда, где каждый вагон – это отдельное слово, написанное по правилам CamelCase:
CamelCaseTrain:
SteamEngine🚂WagonFullOfCamels🚃SnakePassenger🚃LastWagon
А при переводе в snake_case эти вагоны упорядочиваются в спокойную последовательность:
snake_case_train:
🚂steam_engine_wagon_full_of_camels_snake_passenger_last_wagon
Все на борт! Проедемся вместе до остановки snake_case
!
Продвинутые техники: акронимы и аббревиатуры
Управление акронимами
Акронимы в строках формата CamelCase могут усложнить процесс преобразования. Возможно, придётся адаптировать существующие методы или использовать специализированные библиотеки:
print(camel_to_snake_advanced('NASAExplorer')) # nasa_explorer
Акронимы больше не проблема!
Правильное обращение с аббревиатурами
Аббревиатуры могут создавать особые трудности для процесса конвертации. Чуткость к деталям позволяет изящно обходить эту проблему:
print(camel_to_snake_advanced('HTTPRequestAPI')) # http_request_api
Легко, как расшифровка аббревиатуры!
PEP-8: светящийся маяк чистоты и стандартизации Python
Согласно PEP-8, иногда нам требуется вручную проверить код на предмет его читаемости и гармоничности. Автоматизированные методы не всегда идеально следуют стандартам PEP-8.
Полезные материалы
- Изящная функция для преобразования CamelCase в snake_case на Python – Stack Overflow – обсуждение разных способов преобразования.
- re — Работа с регулярными выражениями — Документация Python 3.12.1 – официальная документация Python, посвященная регулярным выражениям.
- Встроенные типы — Документация Python 3.12.1 – раздел документации Python, где описан метод
str.join
и другие операции со строками. - Inflection — документация inflection 0.4.0 – документация к библиотеке Inflection, позволяющей преобразовывать строки.
- GitHub – nficano/humps: Convert strings (and dictionary keys) – библиотека humps, предназначенная для конвертации строк.
- PEP 8 – Руководство по стилю кода Python | peps.python.org – стандарты написания кода Python, включая правила наименования.
- case_conversion · PyPI – пакет PyPI, ориентированный на переключение между форматами CamelCase и snake_case.