Análisis de vuelo: cómo matar camellos correctamente 🐪

En el marco de la conversión universal de cadenas a snake_case, este enfoque con expresiones regulares es probablemente la mejor opción:

import re

def to_snake_case(s: str) -> str:
s = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', s)
return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s).replace('-', '_').lower()


🧐 ¿Cómo funciona?

1️⃣ re.sub('(.)([A-Z][a-z]+)', r'\1_\2', s) reemplaza cada letra mayúscula que precede a una minúscula por la misma letra pero con un guion bajo antes.

2️⃣ re.sub('([a-z0-9])([A-Z])', r'\1_\2', s) cambia cada letra mayúscula que precede a una minúscula o dígito por la misma letra pero con un guion bajo antes.

3️⃣ Luego todo se convierte a minúsculas y se reemplaza el guion por guion bajo.

Pero salgamos del marco del problema algorítmico y veamos cómo resolver este problema en la realidad. Si en el proyecto se usa Pydantic, todo esto ya está escrito, probado en millones de líneas de código y viene listo para usar:

from pydantic import BaseModel, ConfigDict
from pydantic.alias_generators import to_camel, to_snake

class FrontendData(BaseModel):
model_config = ConfigDict(
alias_generator=to_camel, # Automáticamente espera camelCase en la entrada
populate_by_name=True
)

python_talk: str # En el código trabajamos con el ortodoxo snake_case

Debajo del capó hay algoritmos refinados que tienen en cuenta casos límite, separadores no estándar y las fantasías enfermizas de los desarrolladores de sistemas adyacentes.

Y si Pydantic no está en el proyecto, existen microbibliotecas como inflection que hacen lo mismo:
import inflection

inflection.underscore("CamelCaseAnd-kebab-case")
# -> 'camel_case_and_kebab_case'

inflection.camelize("python_talk", uppercase_first_letter=False)
# -> 'pythonTalk'


Conocer los algoritmos con expresiones regulares es útil para pasar entrevistas de algoritmos y entender cómo se analizan las cadenas. Pero conocer las herramientas es necesario para no llevar a producción bicicletas caseras que inevitablemente se romperán con el primer payload torcido.

#algoritmoentrevista