s = 'the brown fox'
... haz algo aquí ...
s
debiera ser :
'The Brown Fox'
¿Cuál es la forma más fácil de hacer esto?
python
capitalization
capitalize
TIMEX
fuente
fuente
" ".join(w.capitalize() for w in s.split())
"e g 3b"
, el resultado deseado sería"E G 3b"
. Sin embargo,"e g 3b".title()
vuelve"E G 3B"
.In [2]: 'tEst'.title() Out[2]: 'Test'
El
.title()
método no puede funcionar bienstring.capwords()
Método de prueba ,De los documentos de Python en capwords :
fuente
"There once was a string with an 'that had words right after it and then closed'"
. Con este ejemplo, todos los mundos exceptothat
se capitalizan como se esperaba. Los resultados son"There Once Was A String With An 'that Had Words Right After It And Then Closed'"
title()
en situaciones normales. En mi situación,title()
devuelve una salida incorrecta para nombres con acentos o diéresis, mientras secapwords()
maneja correctamente.Solo porque este tipo de cosas es divertido para mí, aquí hay dos soluciones más.
Divídase en palabras, encierre en mayúsculas cada palabra de los grupos divididos y vuelva a unirse. Esto cambiará el espacio en blanco que separa las palabras en un solo espacio en blanco, sin importar lo que sea.
EDITAR: No recuerdo lo que estaba pensando cuando escribí el código anterior, pero no hay necesidad de crear una lista explícita; podemos usar una expresión generadora para hacerlo de manera perezosa. Así que aquí hay una mejor solución:
Use una expresión regular para que coincida con el comienzo de la cadena, o palabras de separación de espacios en blanco, más un solo carácter que no sea un espacio en blanco; use 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 sin espacios en blanco en mayúsculas. Luego use
re.sub()
para reemplazar los patrones. Este no tiene los problemas de puntuación de la primera solución, ni rehace el espacio en blanco como mi primera solución. Este produce el mejor resultado.Me alegro de haber investigado esta respuesta. ¡No tenía idea de que
re.sub()
podría tomar una función! ¡Puede hacer un procesamiento no trivialre.sub()
para producir el resultado final!fuente
string.capwords
hace, según la documentación en la respuesta de Chen Houwu.Aquí hay un resumen de las diferentes formas de hacerlo, funcionarán para todas estas entradas:
- La solución más simple es dividir la oración en palabras y poner en mayúscula la primera letra y luego volver a unirla:
- Si no desea dividir la cadena de entrada en palabras primero y usar generadores elegantes:
- O sin importar herramientas de iterto:
- O puede usar expresiones regulares, de la respuesta de steveha :
Ahora, estas son algunas otras respuestas que se publicaron, y las entradas para las que no funcionan como se esperaba si estamos utilizando la definición de una palabra que es el comienzo de la oración o algo después de un espacio en blanco:
usar '' para la división arreglará la segunda salida, pero capwords () aún no funcionará para la primera
Tenga cuidado con múltiples espacios en blanco
fuente
lower 123 upper
debería volverlower 123 Upper
, dondeupper
se escribe con mayúscula como sigue a un número. Sé que va más allá del alcance de la pregunta del OP, pero es un buen complemento para su respuesta ya extensa. Gracias por adelantado."([0-9]+)(\s+.)"
lugar de"(^|\s)(\S)"
(hacer coincidir uno o más números, seguido de uno o más espacios y cualquier carácter después), o"([0-9]+)(\s*.)"
si desea poner en mayúscula el carácter después de 'cero o más' espacios después de númeroWW1 - the great war
y la salida enWW1 - The Great War
lugar deWw1 ...
? ¿Ves el problema con las abreviaturas? ¿Estaría dispuesto a agregar algo que demuestre este caso? Me he estado preguntando sobre esto por un tiempo y no puedo pensar en una forma de hacerlo.WW1
lo que saldría comoWW1
Versión lista para copiar y pegar de @jibberia anwser:
fuente
str.join
acepta generadores.join
acepta gen exps, en el casostr.join
particular, generalmente se prefiere usar una lista de comprensión. Esto se debe a quejoin
itera dos veces sobre el argumento y, por lo tanto, es más rápido proporcionar una lista lista para usar en lugar de un generador.str.join
necesitaría repetir dos veces el argumento? Acabo de comprobarlo, no lo hace. Aunque para secuencias pequeñas la comprensión de la lista es más rápida.¿Por qué complicas tu vida con uniones y bucles cuando la solución es simple y segura?
Solo haz esto:
fuente
"the brown fox".capitalize()
?'this is John'
en'This is john'
.string.capitalize()
(esencialmente haciéndose eco de @luckydonald)Si str.title () no funciona para usted, haga las mayúsculas usted mismo.
Un trazador de líneas:
Claro ejemplo:
fuente
Si solo quieres la primera letra:
Pero para capitalizar cada palabra:
fuente
'hello New York'.capitalize()
es'Hello new york'
Una cadena vacía generará un error si accede a [1:], por lo tanto, usaría:
en mayúscula solo la primera letra.
fuente
str.capitalize
sirve?return title[:1].upper() + title[1:]
También se encargará de eso problema, ya que cortar la cadena vacía como eso daría a 2 cadenas vacías, se unieron hacer una cadena vacía que se devuelveComo Mark señaló, debes usar
.title()
:Sin embargo, si desea poner la primera letra en mayúscula dentro de una plantilla de django , puede usar esto:
o usando una variable:
fuente
El método sugerido str.title () no funciona en todos los casos. Por ejemplo:
en lugar de
"A B 3c"
.Creo que es mejor hacer algo como esto:
fuente
Aunque todas las respuestas ya son satisfactorias, trataré de cubrir los 2 casos adicionales junto con todos los casos anteriores.
Aquí puedes usar esto
esto te dará
Espero que esto no sea redundante.
fuente
Para capitalizar palabras ...
@ Gary02127 comentario, debajo del título del trabajo de solución con apóstrofe
fuente
No pase por alto la preservación del espacio en blanco. Si desea procesar
'fred flinstone'
y obtiene en'Fred Flinstone'
lugar de'Fred Flinstone'
, ha corrompido su espacio en blanco. Algunas de las soluciones anteriores perderán espacio en blanco. Aquí hay una solución que es buena para Python 2 y 3 y conserva el espacio en blanco.fuente
Una función rápida funcionó para Python 3
fuente
Capitalizar cadena con espacios no uniformes
Bueno, entiendo que esta es una vieja pregunta y probablemente las respuestas casi se hayan agotado, pero me gustaría agregar al punto de espacios no uniformes de @Amit Gupta. De la pregunta original, nos gustaría capitalizar cada palabra en la cadena
s = 'the brown fox'
. ¿Qué pasa si la cadena estabas = 'the brown fox'
con espacios no uniformes?fuente
** En caso de que quiera reducir el tamaño **
fuente
Realmente me gusta esta respuesta:
Versión lista para copiar y pegar de @jibberia anwser:
Pero algunas de las líneas que estaba enviando separaron algunos caracteres en blanco '' que causaron errores al intentar hacer s [1:]. Probablemente haya una mejor manera de hacer esto, pero tuve que agregar un if len (s)> 0, como en
fuente