python - ejemplos - Título de una cadena con excepciones
django (8)
¡Usa el módulo titlecase.py ! Funciona solo para ingles
>>> from titlecase import titlecase
>>> titlecase(''i am a foobar bazbar'')
''I Am a Foobar Bazbar''
¿Existe una forma estándar en Python para escribir una cadena (es decir, las palabras comienzan con mayúsculas, todos los caracteres en mayúscula tienen minúscula) pero dejando artículos como " and
y " in
minúscula"?
El método del título de Python 2.7 tiene un defecto.
value.title()
devolverá el Asistente de Carpenter cuando el valor sea Asistente de Carpenter
La mejor solución es probablemente la de @BioGeek usando el título de Stuart Colville. Que es la misma solución propuesta por @Etienne.
Hay algunos problemas con esto. Si usa dividir y unir, se ignorarán algunos caracteres de espacio en blanco. Los métodos de capitalizar y título incorporados no ignoran el espacio en blanco.
>>> ''There is a way''.title()
''There Is A Way''
Si una oración comienza con un artículo, no desea la primera palabra de un título en minúscula.
Teniendo esto en cuenta:
import re
def title_except(s, exceptions):
word_list = re.split('' '', s) # re.split behaves as expected
final = [word_list[0].capitalize()]
for word in word_list[1:]:
final.append(word if word in exceptions else word.capitalize())
return " ".join(final)
articles = [''a'', ''an'', ''of'', ''the'', ''is'']
print title_except(''there is a way'', articles)
# There is a Way
print title_except(''a whim of an elephant'', articles)
# A Whim of an Elephant
Hay estos métodos:
>>> mytext = u''i am a foobar bazbar''
>>> print mytext.capitalize()
I am a foobar bazbar
>>> print mytext.title()
I Am A Foobar Bazbar
No hay opción de artículo en minúsculas. Tendría que codificarlo usted mismo, probablemente mediante el uso de una lista de artículos que desea reducir.
One-liner utilizando lista de comprensión y el operador ternario
reslt = " ".join([word.title() if word not in "the a on in of an" else word for word in "Wow, a python one liner for titles".split(" ")])
print(reslt)
Descompostura:
for word in "Wow, a python one liner for titles".split(" ")
Divide la cadena en una lista e inicia un ciclo for (en la lista de comprensión)
word.title() if word not in "the a on in of an" else word
usa el método nativo title()
para titular el caso en la cadena si no es un artículo
" ".join
une a los elementos de la lista con un separador de (espacio)
titlecase.py de titlecase.py de un guión Perl escrito por John Gruber para convertir cadenas en mayúsculas y minúsculas, pero evita capitalizar palabras pequeñas basadas en reglas del Manual de estilo del New York Times, así como atender varios casos especiales.
Algo de la inteligencia de estos guiones:
capitalizan palabras pequeñas como if, in, of, on , etc., pero las descapitalizarán si se escriben con mayúsculas erróneamente en la entrada.
los scripts suponen que las palabras con letras mayúsculas que no sean el primer carácter ya están en mayúscula correctamente. Esto significa que dejarán una palabra como "iTunes" solo, en lugar de convertirla en "ITunes" o, lo que es peor, "Itunes".
se saltan las palabras con puntos de línea; "Example.com" y "del.icio.us" permanecerán en minúscula.
tienen hacks codificados específicamente para tratar casos extraños, como "AT & T" y "Q & A", ambos contienen palabras pequeñas (at y a) que normalmente deberían estar en minúscula.
La primera y la última palabra del título siempre se escriben con mayúscula, por lo que los comentarios como "Nada que temer" se convertirán en "Nada de qué temer".
Una palabra pequeña después de dos puntos se escribirá en mayúscula.
Puedes descargarlo here .
not_these = [''a'',''the'', ''of'']
thestring = ''the secret of a disappointed programmer''
print '' ''.join(word
if word in not_these
else word.title()
for word in thestring.capitalize().split('' ''))
"""Output:
The Secret of a Disappointed Programmer
"""
El título comienza con una palabra en mayúscula y no coincide con el artículo.
capitalize (word)
Esto debería hacer. Lo entiendo de manera diferente.
>>> mytext = u''i am a foobar bazbar''
>>> mytext.capitalize()
u''I am a foobar bazbar''
>>>
De acuerdo, como se dijo en la respuesta anterior, debe hacer una capitalización personalizada:
mytext = u''i soy un foobar bazbar ''
def xcaptilize(word):
skipList = [''a'', ''an'', ''the'', ''am'']
if word not in skipList:
return word.capitalize()
return word
k = mytext.split(" ")
l = map(xcaptilize, k)
print " ".join(l)
Estas salidas
I am a Foobar Bazbar