Creo que la 'r' en "They're" debería estar en minúsculas. Y la 's' en "Bill's" definitivamente debe ser minúscula.
Daniel Fischer
3
@Daniel: ese problema se menciona en los documentos para title: "El algoritmo usa una definición simple e independiente del lenguaje de una palabra como grupos de letras consecutivas. La definición funciona en muchos contextos, pero significa que los apóstrofes en contracciones y los posesivos forman límites de palabras, que puede no ser el resultado deseado ". Una posible solución sería usar la respuesta de Laurence con la expresión regular r"['\w]+"para que los apóstrofos no terminen una coincidencia (se podría agregar puntuación adicional según sea necesario).
Andrew Clark
18
Para el registro, una forma más ordenada de hacer el último ejemplo de CamelCase es como 'make IT camel CaSe'.title().replace(' ', '').
Henry Gomersall
15
Si alguien más siente que está tomando pastillas locas, este es PascalCase, no camelCase.
Rob
4
Buen código, pero camelCase no comienza con CAPITAL. Prueba esto: def toCamel(s): ret = ''.join(x for x in s.title() if not x.isspace()) return ret[0].lower() + ret[1:] Uso:toCamel("WRITE this in camelcase") 'writeThisInCamelcase'
Ron Kalian
22
Este siempre comenzaría con minúsculas y también eliminaría los caracteres no alfanuméricos:
defcamelCase(st):
output = ''.join(x for x in st.title() if x.isalnum())
return output[0].lower() + output[1:]
re.subpuede tomar una función para el "reemplazo" (en lugar de solo una cadena, que es el uso con el que la mayoría de la gente parece estar familiarizada). Esta función de respuesta se llamará con un re.Matchobjeto para cada coincidencia del patrón, y el resultado (que debería ser una cadena) se utilizará como reemplazo para esa coincidencia.
este es bastante bueno, estoy tratando de entender las funciones lambda, gracias por ayudar
daydreamer
1
@JohnMachin Acabo de preguntar porque pensé que agregar alguna explicación haría que tu respuesta fuera más completa y mejor.
NN
@Laurence Gonsalves, ¿qué hace lambda aquí?
Zion
que esta haciendo lambda aqui? de lo que puedo descifrar y de tu explicación. esto es lo que entendí. cuando usa una función en re.sub, ¿cada una se matchpasará a la función? y dado que matchesen las expresiones regulares tienen grupos. por eso existe esta línea lambda m:m.group(0).capitalize()?
Sion
@ Zion sí. Cuando re.subse le da un invocable (por ejemplo: una función) como "reemplazo", pasa el objeto de coincidencia al invocable, y espera recuperar una cadena que es lo que realmente usa como reemplazo. Si encuentra que las lambdas son confusas, la "versión más larga" hace exactamente lo mismo de una manera más detallada.
Laurence Gonsalves
5
¿Por qué no escribes uno? Algo como esto puede satisfacer sus requisitos:
defFixCase(st):return' '.join(''.join([w[0].upper(), w[1:].lower()]) for w in st.split())
gracias, eso ayudó completamente. Mi mal, no pensé en escribir uno en primer lugar
Daydreamer
5
Nota: ¿Por qué estoy dando otra respuesta? Esta respuesta se basa en el título de la pregunta y en la noción de que camelcase se define como: una serie de palabras que se han concatenado (¡sin espacios!) De modo que cada una de las palabras originales comience con una letra mayúscula (el resto en minúsculas) excepto la primera palabra de la serie (que está completamente en minúsculas). También se supone que "todas las cadenas" se refiere al conjunto de caracteres ASCII; unicode no funcionaría con esta solución).
sencillo
Dada la definición anterior, esta función
import re
word_regex_pattern = re.compile("[^A-Za-z]+")
defcamel(chars):
words = word_regex_pattern.split(chars)
return"".join(w.lower() if i is0else w.title() for i, w in enumerate(words))
No tengo una solución para estos casos (u otros que podrían introducirse con algo de creatividad). Entonces, como en todas las cosas que tienen que ver con cadenas, ¡cubra sus propios casos extremos y buena suerte con Unicode!
¿Cómo se puede determinar que una cadena es un caso Camel sin conocer el significado de la oración? En su ejemplo "menos simple", "sanfRancisco" es el caso Camel así como "itSnotcaMelcAse".
Patrice Bernassola
¿Supongo que su entrada tenía apostrafios u otra puntuación? Debo notar otra entrada fallida. Definitivamente una buena captura. ¿Cuál fue la información que proporcionó?
Marc
1
Quiero decir que una secuencia de caracteres sin espacios debe considerarse como 1 palabra. No se puede extraer trabajo de él sin conocer el significado de la oración. Pon "sanfRancisco" o "itSnotcaMelcAse" como entrada de camello () y verás que la salida será la misma.
Patrice Bernassola
Oh, ya veo, sí, creo que tienes razón. Yo superpongo la solución. Lo actualizaré.
Aunque es cuestionable si dejará espacios adentro (los ejemplos muestran que quita espacio, pero hay un problema de seguimiento de errores que indica que los deja adentro).
Respuestas:
¿Por qué no usar
title
Right from the docs?>>> "they're bill's friends from the UK".title() "They'Re Bill'S Friends From The Uk"
Si realmente deseaba PascalCase, puede usar esto:
>>> ''.join(x for x in 'make IT pascal CaSe'.title() if not x.isspace()) 'MakeItPascalCase'
fuente
title
: "El algoritmo usa una definición simple e independiente del lenguaje de una palabra como grupos de letras consecutivas. La definición funciona en muchos contextos, pero significa que los apóstrofes en contracciones y los posesivos forman límites de palabras, que puede no ser el resultado deseado ". Una posible solución sería usar la respuesta de Laurence con la expresión regularr"['\w]+"
para que los apóstrofos no terminen una coincidencia (se podría agregar puntuación adicional según sea necesario).'make IT camel CaSe'.title().replace(' ', '')
.def toCamel(s): ret = ''.join(x for x in s.title() if not x.isspace()) return ret[0].lower() + ret[1:]
Uso:toCamel("WRITE this in camelcase") 'writeThisInCamelcase'
Este siempre comenzaría con minúsculas y también eliminaría los caracteres no alfanuméricos:
def camelCase(st): output = ''.join(x for x in st.title() if x.isalnum()) return output[0].lower() + output[1:]
fuente
def capitalizeWords(s): return re.sub(r'\w+', lambda m:m.group(0).capitalize(), s)
re.sub
puede tomar una función para el "reemplazo" (en lugar de solo una cadena, que es el uso con el que la mayoría de la gente parece estar familiarizada). Esta función de respuesta se llamará con unre.Match
objeto para cada coincidencia del patrón, y el resultado (que debería ser una cadena) se utilizará como reemplazo para esa coincidencia.Una versión más larga de lo mismo:
WORD_RE = re.compile(r'\w+') def capitalizeMatch(m): return m.group(0).capitalize() def capitalizeWords(s): return WORD_RE.sub(capitalizeMatch, s)
Esto precompila el patrón (generalmente considerado de buena forma) y usa una función con nombre en lugar de una lambda.
fuente
match
pasará a la función? y dado quematches
en las expresiones regulares tienen grupos. por eso existe esta línealambda m:m.group(0).capitalize()
?re.sub
se le da un invocable (por ejemplo: una función) como "reemplazo", pasa el objeto de coincidencia al invocable, y espera recuperar una cadena que es lo que realmente usa como reemplazo. Si encuentra que las lambdas son confusas, la "versión más larga" hace exactamente lo mismo de una manera más detallada.¿Por qué no escribes uno? Algo como esto puede satisfacer sus requisitos:
def FixCase(st): return ' '.join(''.join([w[0].upper(), w[1:].lower()]) for w in st.split())
fuente
Nota: ¿Por qué estoy dando otra respuesta? Esta respuesta se basa en el título de la pregunta y en la noción de que camelcase se define como: una serie de palabras que se han concatenado (¡sin espacios!) De modo que cada una de las palabras originales comience con una letra mayúscula (el resto en minúsculas) excepto la primera palabra de la serie (que está completamente en minúsculas). También se supone que "todas las cadenas" se refiere al conjunto de caracteres ASCII; unicode no funcionaría con esta solución).
sencillo
Dada la definición anterior, esta función
import re word_regex_pattern = re.compile("[^A-Za-z]+") def camel(chars): words = word_regex_pattern.split(chars) return "".join(w.lower() if i is 0 else w.title() for i, w in enumerate(words))
, cuando se llama, resultaría de esta manera
camel("San Francisco") # sanFrancisco camel("SAN-FRANCISCO") # sanFrancisco camel("san_francisco") # sanFrancisco
menos simple
¡Tenga en cuenta que falla cuando se presenta con una cadena ya envuelta en camello!
camel("sanFrancisco") # sanfrancisco <-- noted limitation
aún menos simple
Tenga en cuenta que falla con muchas cadenas Unicode
camel("México City") # mXicoCity <-- can't handle unicode
No tengo una solución para estos casos (u otros que podrían introducirse con algo de creatividad). Entonces, como en todas las cosas que tienen que ver con cadenas, ¡cubra sus propios casos extremos y buena suerte con Unicode!
fuente
Biblioteca potencial: https://pypi.org/project/stringcase/
Ejemplo:
import stringcase stringcase.camelcase('foo_bar_baz') # => "fooBarBaz"
Aunque es cuestionable si dejará espacios adentro (los ejemplos muestran que quita espacio, pero hay un problema de seguimiento de errores que indica que los deja adentro).
fuente
solo use .title (), y convertirá la primera letra de cada palabra en mayúscula, resto en pequeño:
>>> a='mohs shahid ss' >>> a.title() 'Mohs Shahid Ss' >>> a='TRUE' >>> b=a.title() >>> b 'True' >>> eval(b) True
fuente
Me gustaría agregar mi pequeña contribución a esta publicación:
def to_camelcase(str): return ' '.join([t.title() for t in str.split()])
fuente
def camelCase(st): s = st.title() d = "".join(s.split()) d = d.replace(d[0],d[0].lower()) return d
fuente