Ejemplo:
HILO -> Hilo
new york -> New York
SAN FRANCISCO -> San Francisco
¿Existe una biblioteca o una forma estándar de realizar esta tarea?
Ejemplo:
HILO -> Hilo
new york -> New York
SAN FRANCISCO -> San Francisco
¿Existe una biblioteca o una forma estándar de realizar esta tarea?
Respuestas:
¿Por qué no usar titleRight 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'
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).
'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:]
def capitalizeWords(s):
return re.sub(r'\w+', lambda m:m.group(0).capitalize(), s)
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.
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.
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()?
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.
¿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())
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).
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
¡Tenga en cuenta que falla cuando se presenta con una cadena ya envuelta en camello!
camel("sanFrancisco") # sanfrancisco <-- noted limitation
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!
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).
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
def camelCase(st):
s = st.title()
d = "".join(s.split())
d = d.replace(d[0],d[0].lower())
return d