s = 'the brown fox'
...hacer algo aquí...
s
debería ser :
'The Brown Fox'
¿Cuál es la forma más fácil de hacer esto?
El método .title()
de una cadena (ya sea ASCII o Unicode está bien) hace esto:
>>> "hello world".title()
'Hello World'
>>> u"hello world".title()
u'Hello World'
Sin embargo, tenga cuidado con las cadenas con apóstrofes incrustados, como se indica en los documentos.
El algoritmo utiliza una definición simple e independiente del idioma de una palabra como grupos de letras consecutivas. La definición funciona en muchos contextos, pero significa que los apóstrofos en las contracciones y los posesivos forman los límites de la palabra, lo que puede no ser el resultado deseado:
"Son los amigos de Bill'del Reino Unidoquot;.title() "They'Re Bill'S Friends From The Uk";
Sólo porque este tipo de cosas me divierten, aquí hay dos soluciones más.
Dividir en palabras, poner las iniciales de cada palabra de los grupos divididos y volver a unirlos. Esto cambiará el espacio en blanco que separa las palabras en un solo espacio en blanco, no importa lo que era.
s = 'the brown fox'
lst = [word[0].upper() + word[1:] for word in s.split()]
s = " ".join(lst)
EDIT: No recuerdo en qué estaba pensando cuando escribí el código anterior, pero no hay necesidad de construir una lista explícita; podemos usar una expresión generadora para hacerlo de forma perezosa. Así que aquí hay una solución mejor:
s = 'the brown fox'
s = ' '.join(word[0].upper() + word[1:] for word in s.split())
Utilice una expresión regular para que coincida con el comienzo de la cadena, o con el espacio en blanco que separa las palabras, más un único carácter que no sea un espacio en blanco; utilice paréntesis para marcar "grupos de coincidencia". Escriba una función que tome un objeto de coincidencia, y devuelva el grupo de coincidencia de espacios en blanco sin cambios y el grupo de coincidencia de caracteres que no son espacios en blanco en mayúsculas. Entonces use re.sub()
para reemplazar los patrones. Esta no tiene los problemas de puntuación de la primera solución, ni rehace el espacio en blanco como mi primera solución. Esta produce el mejor resultado.
import re
s = 'the brown fox'
def repl_func(m):
"""process regular expression match groups for word upper-casing problem"""
return m.group(1) + m.group(2).upper()
s = re.sub("(^|\s)(\S)", repl_func, s)
>>> re.sub("(^|\s)(\S)", repl_func, s)
"They're Bill's Friends From The UK"
Me alegro de haber investigado esta respuesta. ¡No tenía ni idea de que re.sub()
podía tomar una función! ¡Puedes hacer un procesamiento no trivial dentro de re.sub()
para producir el resultado final!
Si str.title() no le funciona, haga usted mismo las mayúsculas.
Una sola línea:
>>> ' '.join([s[0].upper() + s[1:] for s in "they're bill's friends from the UK".split(' ')])
"They're Bill's Friends From The UK"
Ejemplo claro:
input = "they're bill's friends from the UK"
words = input.split(' ')
capitalized_words = []
for word in words:
title_case_word = word[0].upper() + word[1:]
capitalized_words.append(title_case_word)
output = ' '.join(capitalized_words)