Dans le cadre de la conversion universelle d'une chaîne en snake_case, cette approche avec des expressions régulières est probablement la meilleure option :
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()🧐 Comment ça marche ?
1️⃣
re.sub('(.)([A-Z][a-z]+)', r'\1_\2', s) remplace chaque lettre majuscule précédée d'une minuscule par la même lettre, mais avec un tiret bas devant elle.2️⃣
re.sub('([a-z0-9])([A-Z])', r'\1_\2', s) remplace chaque lettre majuscule précédée d'une minuscule ou d'un chiffre par la même lettre, mais avec un tiret bas devant elle.3️⃣ Ensuite, on met tout en minuscules et on remplace le trait d'union par un tiret bas.
Mais sortons du cadre de l'exercice algorithmique et voyons comment résoudre ce problème dans la réalité. Si le projet utilise Pydantic, tout cela est déjà écrit, testé sur des millions de lignes de code et prêt à l'emploi :
from pydantic import BaseModel, ConfigDict
from pydantic.alias_generators import to_camel, to_snake
class FrontendData(BaseModel):
model_config = ConfigDict(
alias_generator=to_camel, # Attend automatiquement du camelCase en entrée
populate_by_name=True
)
python_talk: str # Dans le code, on travaille avec du snake_case orthodoxeSous le capot se trouvent des algorithmes affinés qui prennent en compte les cas limites, les séparateurs non standard et les fantaisies maladives des développeurs de systèmes adjacents.
Et si Pydantic n'est pas dans le projet, il existe des micro-bibliothèques comme inflection qui font la même chose :
import inflection
inflection.underscore("CamelCaseAnd-kebab-case")
# -> 'camel_case_and_kebab_case'
inflection.camelize("python_talk", uppercase_first_letter=False)
# -> 'pythonTalk'Connaître les algorithmes basés sur les regex est utile pour réussir les entretiens algorithmiques et comprendre comment les chaînes sont analysées. Mais connaître les outils est nécessaire pour ne pas traîner en production des vélos maison qui tomberont inévitablement en panne au premier payload tordu.
#algospeak
Kommentare
0Noch keine Kommentare.
Melde dich an, um mitzudiskutieren.