Exemple:
>>> convert('CamelCase')
'camel_case'
python
camelcasing
Sridhar Ratnakumar
la source
la source
NotCamelCase
maisthisIs
Réponses:
Etui camel à étui serpent
Si vous faites cela plusieurs fois et que ce qui précède est lent, compilez au préalable l'expression régulière:
Pour gérer des cas plus avancés spécialement (ce n'est plus réversible):
Etui serpent à étui camel
la source
not_camel_case
versnotCamelCase
et / ouNotCamelCase
?s2.replace('__', '_')
Il y a une bibliothèque d'inflexion dans l'index du package qui peut gérer ces choses pour vous. Dans ce cas, vous recherchez
inflection.underscore()
:la source
Je ne sais pas pourquoi tout cela est si compliqué.
pour la plupart des cas, la simple expression
([A-Z]+)
fera l'affairePour ignorer le premier caractère, ajoutez simplement regarder derrière
(?!^)
Si vous souhaitez séparer ALLCaps en all_caps et attendre des nombres dans votre chaîne, vous n'avez toujours pas besoin de faire deux exécutions distinctes. Utilisez simplement
|
cette expression qui((?<=[a-z0-9])[A-Z]|(?!^)[A-Z](?=[a-z]))
peut gérer à peu près tous les scénarios du livre.Tout dépend de ce que vous voulez, alors utilisez la solution qui convient le mieux à vos besoins car elle ne devrait pas être trop compliquée.
nJoy!
la source
(?!^)
expression qu'on appelle un regard derrière. À moins que je manque quelque chose, ce que nous voulons vraiment ici, c'est un regard négatif qui devrait être exprimé comme suit(?<!^)
. Pour des raisons que je ne peux pas comprendre, votre anticipation négative(?!^)
semble également fonctionner ..."Camel2WARNING_Case_CASE"
devient"camel2_warning_case__case"
. Vous pouvez ajouter un(?<!_)
lookbehind négatif, pour le résoudre:re.sub('((?<=[a-z0-9])[A-Z]|(?!^)(?<!_)[A-Z](?=[a-z]))', r'_\1', "Camel2WARNING_Case_CASE").lower()
retours'camel2_warning_case_case'
(?!^)
été incorrectement appelé un "regard derrière" et aurait plutôt dû être appelé affirmation d'anticipation négative . Comme le montre cette belle explication , les lookaheads négatifs viennent généralement après l'expression que vous recherchez. Vous pouvez donc penser(?!^)
à "trouver''
où<start of string>
ne suit pas". En effet, un lookbehind négatif fonctionne également: vous pouvez penser(?<!^)
à "trouver''
où<start of string>
ne précède pas".stringcase est ma bibliothèque de référence pour cela; par exemple:
la source
Je préfère éviter
re
si possible:la source
re
bibliothèque et de faire les choses uniquement sur une seule ligne en utilisant uniquement les str.methods intégrés! Il est similaire à cette réponse , mais évite d'utiliser le découpage et les ajoutsif ... else
en supprimant simplement "_" potentiellement ajouté comme premier caractère. J'aime le plus.6.81 µs ± 22.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
mais pour cette réponse2.51 µs ± 25.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
qui est 2,5 fois plus rapide! Aime ça!Personnellement, je ne sais pas comment quelque chose utilisant des expressions régulières en python peut être décrit comme élégant. La plupart des réponses ici ne font que des tours de type RE de «golf de code». Le codage élégant est censé être facilement compris.
la source
+=
sur les cordes est presque toujours une mauvaise idée. Ajouter à une liste et''.join()
à la fin. Ou dans ce cas, il suffit de le joindre avec un trait de soulignement ...la source
Je pense que cette solution est plus simple que les réponses précédentes:
Quelles sorties:
L'expression régulière correspond à trois modèles:
[A-Z]?[a-z]+
: Lettres minuscules consécutives commençant éventuellement par une lettre majuscule.[A-Z]{2,}(?=[A-Z][a-z]|\d|\W|$)
: Deux lettres majuscules consécutives ou plus. Il utilise un lookahead pour exclure la dernière lettre majuscule si elle est suivie d'une lettre minuscule.\d+
: Nombres consécutifs.En utilisant,
re.findall
nous obtenons une liste de "mots" individuels qui peuvent être convertis en minuscules et joints avec des traits de soulignement.la source
Je ne sais pas pourquoi utiliser les deux appels .sub ()? :) Je ne suis pas un gourou des regex, mais j'ai simplifié la fonction pour celui-ci, qui convient à mes besoins, j'avais juste besoin d'une solution pour convertir camelCasedVars de la requête POST en vars_with_underscore:
Cela ne fonctionne pas avec des noms tels que getHTTPResponse, car j'ai entendu dire que c'est une mauvaise convention de dénomination (devrait être comme getHttpResponse, c'est évidemment, qu'il est beaucoup plus facile de mémoriser ce formulaire).
la source
'HTTPConnectionFactory'
, votre code produit'h_tt_pconnection_factory'
, le code de la réponse acceptée produit'http_connection_factory'
Voici ma solution:
Il prend en charge les cas d'angle discutés dans les commentaires. Par exemple, il va convertir
getHTTPResponseCode
àget_http_response_code
comme il devrait.la source
Pour le plaisir:
Ou, plus pour le plaisir:
la source
str.join
est obsolète depuis des lustres . Utilisez''.join(..)
plutôt.L'utilisation d'expressions régulières peut être la plus courte, mais cette solution est beaucoup plus lisible:
la source
Tant de méthodes compliquées ... Il suffit de trouver tout le groupe "Titled" et de rejoindre sa variante avec un trait de soulignement inférieur.
Si vous ne voulez pas faire de nombres comme le premier caractère du groupe ou un groupe séparé - vous pouvez utiliser le
([A-z][a-z0-9]*)
masque.la source
Pas dans la bibliothèque standard, mais j'ai trouvé ce script qui semble contenir les fonctionnalités dont vous avez besoin.
la source
Ce n'est pas une méthode élégante, c'est une implémentation de très bas niveau d'une machine à états simple (machine à états à champ de bits), probablement le mode le plus anti-pythonique pour résoudre ce problème, mais le module implémente également une machine à états trop complexe pour résoudre ce problème simple tâche, donc je pense que c'est une bonne solution.
splitsymbol peut analyser tous les types de cas: UpperSEQUENCEInterleaved, under_score, BIG_SYMBOLS et cammelCasedMethods
J'espère que cela est utile
la source
Légèrement adapté de https://stackoverflow.com/users/267781/matth qui utilise des générateurs.
la source
Jetez un œil à l'excellente bibliothèque Schematics
https://github.com/schematics/schematics
Il vous permet de créer des structures de données typées qui peuvent sérialiser / désérialiser de python en saveur Javascript, par exemple:
la source
Cette méthode simple devrait faire le travail:
(extrait d' ici , voir l' exemple de travail en ligne )
la source
Wow, je viens de voler ça aux extraits de django. ref http://djangosnippets.org/snippets/585/
Assez élégant
Exemple:
Retour:
REGEX DEMO
la source
Un exemple horrible utilisant des expressions régulières (vous pouvez facilement nettoyer ça :)):
Fonctionne pour getHTTPResponseCode!
Alternativement, en utilisant lambda:
EDIT: Il devrait également être assez facile de voir qu'il y a place à amélioration pour des cas comme "Test", car le trait de soulignement est inséré sans condition.
la source
Voici quelque chose que j'ai fait pour modifier les en-têtes d'un fichier délimité par des tabulations. J'omets la partie où je n'ai édité que la première ligne du fichier. Vous pouvez l'adapter assez facilement à Python avec la bibliothèque re. Cela comprend également la séparation des nombres (mais conserve les chiffres ensemble). Je l'ai fait en deux étapes, car c'était plus facile que de lui dire de ne pas mettre de soulignement au début d'une ligne ou d'un onglet.
Première étape ... rechercher des lettres majuscules ou des entiers précédés de lettres minuscules et les faire précéder d'un trait de soulignement:
Chercher:
Remplacement:
Deuxième étape ... prenez ce qui précède et exécutez-le à nouveau pour convertir toutes les majuscules en minuscules:
Chercher:
Remplacement (c'est-à-dire barre oblique inverse, L minuscule, barre oblique inverse, un):
la source
Je cherchais une solution au même problème, sauf que j'avais besoin d'une chaîne; par exemple
À partir des belles solutions en deux mots ici, j'ai trouvé ce qui suit:
La plupart de la logique compliquée consiste à éviter de mettre en minuscule le premier mot. Voici une version plus simple si cela ne vous dérange pas de modifier le premier mot:
Bien sûr, vous pouvez précompiler les expressions régulières ou joindre avec un trait de soulignement au lieu d'un trait d'union, comme indiqué dans les autres solutions.
la source
Concis sans expressions régulières, mais HTTPResponseCode => httpresponse_code:
la source
Sans aucune bibliothèque:
Un peu lourd, mais
la source
Très beau RegEx proposé sur ce site :
Si python a une méthode String Split, cela devrait fonctionner ...
En Java:
la source
Et si nous devons couvrir un cas avec une entrée déjà non camelée:
la source
Juste au cas où quelqu'un aurait besoin de transformer un fichier source complet, voici un script qui le fera.
la source
J'ai eu pas mal de chance avec celui-ci:
Cela pourrait évidemment être optimisé pour la vitesse d' un petit peu si vous voulez.
la source
la source
Utilisez:
str.capitalize()
pour convertir la première lettre de la chaîne (contenue dans la variable str) en une lettre majuscule et renvoie la chaîne entière.Exemple: Commande: "bonjour" .capitalize () Sortie: Bonjour
la source