Ejemplo:
>>> convert('CamelCase')
'camel_case'
python
camelcasing
Sridhar Ratnakumar
fuente
fuente
NotCamelCase
perothisIs
Respuestas:
Camel caso a serpiente
Si hace esto muchas veces y lo anterior es lento, compile la expresión regular de antemano:
Para manejar casos más avanzados especialmente (esto ya no es reversible):
Caso de serpiente a caso de camello
fuente
not_camel_case
anotCamelCase
y / oNotCamelCase
?s2.replace('__', '_')
Hay una biblioteca de inflexiones en el índice del paquete que puede manejar estas cosas por usted. En este caso, estarías buscando
inflection.underscore()
:fuente
No sé por qué todo esto es tan complicado.
para la mayoría de los casos, la expresión simple
([A-Z]+)
hará el trucoPara ignorar el primer personaje simplemente agrega mirar detrás
(?!^)
Si desea separar ALLCaps a all_caps y espera números en su cadena, todavía no necesita hacer dos ejecuciones separadas, solo use
|
Esta expresión((?<=[a-z0-9])[A-Z]|(?!^)[A-Z](?=[a-z]))
puede manejar casi todos los escenarios del libroTodo depende de lo que desee, así que use la solución que mejor se adapte a sus necesidades, ya que no debería ser demasiado complicado.
nJoy!
fuente
(?!^)
expresión que se llamaba mirar hacia atrás. A menos que me falte algo, lo que realmente queremos aquí es una mirada negativa que debe expresarse como(?<!^)
. Por razones que no entiendo, su mirada negativa hacia adelante(?!^)
parece funcionar también ..."Camel2WARNING_Case_CASE"
convierte en"camel2_warning_case__case"
. Puede agregar una(?<!_)
mirada negativa hacia atrás, para resolverlo:re.sub('((?<=[a-z0-9])[A-Z]|(?!^)(?<!_)[A-Z](?=[a-z]))', r'_\1', "Camel2WARNING_Case_CASE").lower()
retornos'camel2_warning_case_case'
(?!^)
se llamó incorrectamente "mirar hacia atrás" y en su lugar debería haberse llamado afirmación negativa anticipada . Como muestra esta buena explicación , las miradas negativas generalmente aparecen después de la expresión que estás buscando. Por lo tanto, puede pensar(?!^)
en "encontrar''
donde<start of string>
no sigue". De hecho, una mirada hacia atrás negativa también funciona: se puede pensar(?<!^)
como "buscar''
donde<start of string>
no precede".stringcase es mi biblioteca de acceso para esto; p.ej:
fuente
Prefiero evitar
re
si es posible:fuente
re
biblioteca y hacer las cosas solo en una línea usando métodos str. incorporados! Es similar a esta respuesta , pero evita el uso de segmentación y adicionalif ... else
simplemente quitando "_" potencialmente agregado como primer carácter. Esto me gusta más6.81 µs ± 22.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
pero para esta respuesta2.51 µs ± 25.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
que es 2.5 veces más rápida! ¡Me gusta esto!Personalmente, no estoy seguro de cómo algo que usa expresiones regulares en Python puede describirse como elegante. La mayoría de las respuestas aquí solo están haciendo trucos RE de "código de golf". Se supone que la codificación elegante se entiende fácilmente.
fuente
+=
en cadenas es casi siempre una mala idea. Añadir a una lista y''.join()
al final. O en este caso, simplementefuente
Creo que esta solución es más sencilla que las respuestas anteriores:
Qué salidas:
La expresión regular coincide con tres patrones:
[A-Z]?[a-z]+
: Letras minúsculas consecutivas que opcionalmente comienzan con una letra mayúscula.[A-Z]{2,}(?=[A-Z][a-z]|\d|\W|$)
: Dos o más letras mayúsculas consecutivas. Utiliza una búsqueda anticipada para excluir la última letra mayúscula si es seguida por una letra minúscula.\d+
: Numeros consecutivos.Al usarlo
re.findall
, obtenemos una lista de "palabras" individuales que se pueden convertir a minúsculas y unir con guiones bajos.fuente
No tengo idea de por qué usar ambas llamadas .sub ()? :) No soy regex guru, pero simplifiqué la función para este, que es adecuado para mis necesidades, solo necesitaba una solución para convertir camelCasedVars de la solicitud POST a vars_with_underscore:
No funciona con nombres como getHTTPResponse, porque escuché que es una convención de nomenclatura incorrecta (debería ser como getHttpResponse, obviamente, es mucho más fácil memorizar este formulario).
fuente
'HTTPConnectionFactory'
, con , su código produce'h_tt_pconnection_factory'
, el código de la respuesta aceptada produce'http_connection_factory'
Aquí está mi solución:
Es compatible con los casos de esquina discutidos en los comentarios. Por ejemplo, se convertirá
getHTTPResponseCode
aget_http_response_code
lo que debería.fuente
Por diversión:
O, más por el gusto de hacerlo:
fuente
str.join
ha quedado en desuso por siglos . Usar en su''.join(..)
lugar.El uso de expresiones regulares puede ser el más corto, pero esta solución es mucho más legible:
fuente
Tantos métodos complicados ... Simplemente encuentre todo el grupo "Titulado" y únase a su variante en minúsculas con guión bajo.
Si no desea crear números como el primer carácter del grupo o un grupo separado, puede usar la
([A-z][a-z0-9]*)
máscara.fuente
No en la biblioteca estándar, pero encontré este script que parece contener la funcionalidad que necesita.
fuente
Este no es un método elegante, es una implementación de 'nivel bajo' de una máquina de estado simple (máquina de estado de campo de bits), posiblemente el modo más antipitónico para resolver esto, sin embargo, re module también implementa una máquina de estado demasiado compleja para resolver este problema simple. tarea, así que creo que esta es una buena solución.
splitsymbol puede analizar todos los tipos de casos: UpperSEQUENCEInterleaved, under_score, BIG_SYMBOLS y cammelCasedMethods
Espero que sea útil
fuente
Ligeramente adaptado de https://stackoverflow.com/users/267781/matth que usan generadores.
fuente
Echa un vistazo a la excelente lib Schematics
https://github.com/schematics/schematics
Le permite crear estructuras de datos mecanografiados que pueden serializar / deserializar desde Python a Javascript Javascript, por ejemplo:
fuente
Este método simple debería hacer el trabajo:
(tomado de aquí , ver ejemplo de trabajo en línea )
fuente
Wow, acabo de robar esto de los fragmentos de Django. ref http://djangosnippets.org/snippets/585/
Bastante elegante
Ejemplo:
Devoluciones:
DEMO REGEX
fuente
Un ejemplo horrendo que usa expresiones regulares (podría limpiar esto fácilmente :)):
Sin embargo, funciona para getHTTPResponseCode.
Alternativamente, usando lambda:
EDITAR: También debería ser bastante fácil ver que hay margen de mejora para casos como "Prueba", porque el guión bajo se inserta incondicionalmente.
fuente
Aquí hay algo que hice para cambiar los encabezados en un archivo delimitado por tabulaciones. Estoy omitiendo la parte donde solo edité la primera línea del archivo. Puede adaptarlo a Python con bastante facilidad con la biblioteca re. Esto también incluye separar los números (pero mantiene los dígitos juntos). Lo hice en dos pasos porque era más fácil que decirle que no pusiera un guión bajo al comienzo de una línea o tabulación.
Paso uno ... encuentre letras mayúsculas o enteros precedidos por letras minúsculas y preceda con un guión bajo:
Buscar:
Reemplazo:
Paso dos ... toma lo anterior y ejecútalo de nuevo para convertir todas las mayúsculas a minúsculas:
Buscar:
Reemplazo (eso es barra invertida, L minúscula, barra invertida, una):
fuente
Estaba buscando una solución al mismo problema, excepto que necesitaba una cadena; p.ej
A partir de las buenas soluciones de dos palabras aquí, se me ocurrió lo siguiente:
La mayor parte de la lógica complicada es evitar poner en minúscula la primera palabra. Aquí hay una versión más simple si no te importa alterar la primera palabra:
Por supuesto, puede precompilar las expresiones regulares o unirse con guión bajo en lugar de guión, como se discutió en las otras soluciones.
fuente
Conciso sin expresiones regulares, pero HTTPResponseCode => httpresponse_code:
fuente
Sin ninguna biblioteca:
Un poco pesado, pero
fuente
Muy agradable RegEx propuesto en este sitio :
Si Python tiene un método de división de cadenas, debería funcionar ...
En Java:
fuente
Y si necesitamos cubrir un caso con una entrada ya sin camelar:
fuente
En caso de que alguien necesite transformar un archivo fuente completo, aquí hay un script que lo hará.
fuente
He tenido bastante buena suerte con este:
Obviamente, esto puede ser optimizado para la velocidad de una pequeña poco si así lo desea.
fuente
fuente
Utilizar:
str.capitalize()
para convertir la primera letra de la cadena (contenida en una cadena variable) a una letra mayúscula y devuelve la cadena completa.Ejemplo: Comando: "hola" .capitalize () Salida: Hola
fuente