Pregunta

¿Hay una manera estándar de Python para TitleCase una cadena (es decir, comenzar con palabras mayúsculas, todos los caracteres alfabéticos restantes tienen minúscula) pero dejando artículos como and, in y of en minúsculas?

¿Fue útil?

Solución

Hay algunos problemas con esto. Si utiliza dividir y unir, se tendrán en cuenta algunos caracteres de espacio en blanco. El built-in capitalizar y métodos de título no ignoran los espacios en blanco.

>>> 'There     is a way'.title()
'There     Is A Way'

Si una oración comienza con un artículo, que no quieren que la primera palabra de un título en minúsculas.

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

Otros consejos

Utilice el titlecase.py módulo! Sólo funciona para Inglés.

>>> from titlecase import titlecase
>>> titlecase('i am a foobar bazbar')
'I Am a Foobar Bazbar'

GitHub: https://github.com/ppannuto/python-titlecase

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 ninguna opción artículo minúsculas. Habría que código que usted mismo, probablemente mediante el uso de una lista de artículos que desea bajar.

Stuart Colville ha hecho un puerto Python un script Perl escrito por John Gruber para convertir cadenas en caso de título pero evita que capitalizan pequeñas palabras basándose en las reglas de The New York Times Manual de estilo, así como la restauración de varias casos especiales.

Algunos de la inteligencia de estas secuencias de comandos:

  • que capitaliza pequeñas palabras como si, en, entre, por , etc., pero la voluntad no-capitalizarlos si están capitalizadas por error en la entrada.

  • los scripts asumen que las palabras con letras mayúsculas que no sea el primer carácter que ya se capitalizan correctamente. Esto significa que dejarán una palabra como “iTunes” por sí solos, en lugar de mangling en “iTunes” o, peor aún, “iTunes”.

  • se saltan sobre cualquier palabra con los puntos de la línea; “Example.com” y “del.icio.us” permanecerá en minúsculas.

  • tienen hacks no modificables específicamente para hacer frente a los casos impares, como “AT & T” y “Q & A”, ambos de los cuales contienen pequeñas palabras (a y a) que normalmente debería ser minúscula.

  • La primera y la última palabra del título siempre están en mayúsculas, por lo que de entrada, tales como “No hay nada que temer” se convirtió en “nada que temer”.

  • se capitalizará Una pequeña palabra después de dos puntos.

Puede descargarlo aquí .

capitalize (word)

Esto debería hacer. Lo entiendo de otra manera.

>>> mytext = u'i am a foobar bazbar'
>>> mytext.capitalize()
u'I am a foobar bazbar'
>>>

Ok como se ha dicho en la respuesta anterior, usted tiene que hacer un encargo de mayúscula:

mitexto = u'i am 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)   

Este salidas

I am a Foobar Bazbar

método título de Python 2.7 tiene un defecto en el mismo.

value.title()

devolverá Carpenter S Asistente cuando el valor es carpintero ' s Asistente

La mejor solución es probablemente el de @BioGeek usando TitleCase de Stuart Colville. Que es la misma solución propuesta por @Etienne.

 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 la palabra en mayúsculas y que no concuerda con el artículo.

One-liner utilizando la 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)

Desglose:

for word in "Wow, a python one liner for titles".split(" ") divide la cadena en una lista y se inicia un bucle (en la lista comprehenstion)

word.title() if word not in "the a on in of an" else word utiliza el método title() nativa a mayúsculas la cadena si no es un artículo

" ".join se une a los elementos de la lista con un separador de (espacio)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top