Domanda

C'è un modo standard in Python per Titlecase una stringa (vale a dire le parole iniziare con caratteri maiuscoli, tutti i caratteri con carter rimanenti hanno minuscolo) ma lasciando articoli come and, in, e of caratteri minuscoli?

È stato utile?

Soluzione

Ci sono alcuni problemi con questo. Se si utilizza dividere e unire, alcuni caratteri di spazio vuoto verranno ignorati. Il built-in capitalizzare e metodi titolo non ignorare lo spazio bianco.

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

Se una frase inizia con un articolo, non si desidera la prima parola di un titolo in minuscolo.

Tenendo questo in mente:

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

Altri suggerimenti

Utilizza la titlecase.py modulo! Funziona solo per l'inglese.

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

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

Ci sono questi metodi:

>>> mytext = u'i am a foobar bazbar'
>>> print mytext.capitalize()
I am a foobar bazbar
>>> print mytext.title()
I Am A Foobar Bazbar

Non c'è alcuna opzione articolo minuscolo. Dovreste codice che voi stessi, probabilmente utilizzando un elenco di articoli che si desidera abbassare.

Stuart Colville ha fatto una porta Python di uno script Perl scritto da John Gruber per convertire le stringhe in caso di titolo ma evita capitalizzando piccole parole in base alle regole del New York Times manuale di stile, nonché di ristorazione per diversi casi particolari.

Alcuni dei bravura di questi script:

  • che capitalizza piccole parole come se, in, di, il , ecc, ma la volontà non-capitalizzare loro se sono erroneamente capitalizzati nell'input.

  • gli script per scontato che le parole con le lettere in maiuscolo diversi dal primo carattere sono già in maiuscolo correttamente. Questo significa che lasceranno una parola come “iTunes” da solo, invece di pressare in “iTunes” o, peggio, “iTunes”.

  • saltano su qualsiasi parola con i puntini di linea; “Example.com” e “del.icio.us” rimarrà minuscolo.

  • hanno hack hard-coded specificamente per affrontare i casi strani, come “AT & T” e “Q & A”, entrambi i quali contengono piccole parole (a e a) che normalmente dovrebbe essere in minuscolo.

  • La prima e l'ultima parola del titolo sono sempre in maiuscolo, in modo di input come ad esempio “Nulla da temere” sarà trasformato in “Niente di cui aver paura”.

  • Una piccola parola dopo i due punti sarà capitalizzata.

E 'possibile scaricare il programma qui .

capitalize (word)

Questo dovrebbe fare. Ho capito in modo diverso.

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

Ok come detto in risposta sopra, si deve fare capitalizzare una consuetudine:

mytext = u'i del mattino 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)   

Questo uscite

I am a Foobar Bazbar

Python 2.7 del metodo titolo ha un difetto in esso.

value.title()

tornerà Carpenter ' S Assistente quando il valore è Carpenter' s Assistente

La soluzione migliore è probabilmente quella da @BioGeek utilizzando Titlecase da Stuart Colville. Che è la stessa soluzione proposta da @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
"""

Il titolo inizia con la parola maiuscola e che non corrisponde a questo articolo.

Un-liner utilizzando di lista e l'operatore 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)

Breakdown:

for word in "Wow, a python one liner for titles".split(" ") Divide la stringa in un elenco e gli iniziati un ciclo for (nella lista comprehenstion)

word.title() if word not in "the a on in of an" else word utilizza il metodo nativo title() a caso il titolo la stringa se non è un articolo

" ".join unisce gli elementi della lista con un separatore di (spazio)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top