332 votes

Fonction de Python élégante pour convertir CamelCase pour camel_case ?

Exemple :

942voto

epost Points 31

C’est assez complet :

Fonctionne avec tous ces (et ne nuit pas les versions déjà-ONU-cameled) :

Ou si vous allez à l’appeler un zillion fois, vous pouvez précompiler les regexes :

241voto

Brad Koch Points 4046

Il y a une bibliothèque d’inflexion dans l’index de paquet qui peut gérer ces choses pour vous. Dans ce cas, vous regarderait `` :

131voto

nickl- Points 1772

Je ne sais pas pourquoi ils sont tous tellement compliquer.

pour la plupart des cas, la simple expression ([A-Z]+) fera l'affaire

>>> re.sub('([A-Z]+)', r'_\1','CamelCase').lower()
'_camel_case'  
>>> re.sub('([A-Z]+)', r'_\1','camelCase').lower()
'camel_case'
>>> re.sub('([A-Z]+)', r'_\1','camel2Case2').lower()
'camel2_case2'
>>> re.sub('([A-Z]+)', r'_\1','camelCamelCase').lower()
'camel_camel_case'
>>> re.sub('([A-Z]+)', r'_\1','getHTTPResponseCode').lower()
'get_httpresponse_code'

D'ignorer le premier personnage ajoutez simplement regarder derrière (?!^)

>>> re.sub('(?!^)([A-Z]+)', r'_\1','CamelCase').lower()
'camel_case'
>>> re.sub('(?!^)([A-Z]+)', r'_\1','CamelCamelCase').lower()
'camel_camel_case'
>>> re.sub('(?!^)([A-Z]+)', r'_\1','Camel2Camel2Case').lower()
'camel2_camel2_case'
>>> re.sub('(?!^)([A-Z]+)', r'_\1','getHTTPResponseCode').lower()
'get_httpresponse_code'

Si vous souhaitez séparer ALLCaps à all_caps et attendre les chiffres de votre chaîne vous n'avez toujours pas besoin de faire deux pistes séparées suffit d'utiliser | Cette expression ((?<=[a-z0-9])[A-Z]|(?!^)[A-Z](?=[a-z])) peut gérer à peu près chaque scénario dans le livre

>>> a = re.compile('((?<=[a-z0-9])[A-Z]|(?!^)[A-Z](?=[a-z]))')
>>> a.sub(r'_\1', 'getHTTPResponseCode').lower()
'get_http_response_code'
>>> a.sub(r'_\1', 'get2HTTPResponseCode').lower()
'get2_http_response_code'
>>> a.sub(r'_\1', 'get2HTTPResponse123Code').lower()
'get2_http_response123_code'
>>> a.sub(r'_\1', 'HTTPResponseCode').lower()
'http_response_code'
>>> a.sub(r'_\1', 'HTTPResponseCodeXYZ').lower()
'http_response_code_xyz'

Tout dépend de ce que vous voulez pour l'utilisation de la solution qui correspond le mieux à vos besoins car il ne devrait pas être trop compliqué.

nJoy!

9voto

TehTris Points 750

Personnellement je ne suis pas sûr comment quoi que ce soit en utilisant des expressions régulières en python peut être décrit comme élégant. La plupart des réponses ici ne font que « code golf » type RE astuces. Codage élégant est censé pour être faciles à comprendre.

5voto

desper4do Points 1

Je ne reçois pas idée pourquoi en utilisant les deux .sub() appelle ? :) Je ne suis pas gourou regex, mais j’ai simplifié la fonction de celui-ci, qui convient à mes besoins de certains, j’ai juste besoin d’une solution pour convertir camelCasedVars de requête POST à vars_with_underscore :

Il ne fonctionne pas avec des noms comme getHTTPResponse, cause j’ai entendu c’est mauvais, convention de nommage (devrait être comme getHttpResponse, c’est de toute évidence, qu’il a beaucoup plus facilement mémoriser ce formulaire).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X