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_caseDebajo 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
Comentarios
0Aún no hay comentarios.
Inicia sesión para participar en la conversación.