2010-09-16 4 views
62

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

risposta

116

Ci sono alcuni problemi con questo. Se usi split e join, alcuni caratteri dello spazio bianco verranno ignorati. I metodi di capitalizzazione e titolo incorporati non ignorano 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 
+5

+1 per il caso "frase che inizia con un articolo" – yassin

+0

Perché è necessario? C'è una funzione "" ".split' che fa lo stesso. – wizzwizz4

+0

@ wizzwizz4: 'str.split' non considera gli spazi contigui. 're.split' conserva spazi. Quindi, questa funzione non consuma spazi. – dheerosaur

14

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. Dovresti codificarti da solo, probabilmente usando un elenco di articoli che vuoi ridurre.

+0

titlecase.py caratteri minuscoli articoli. –

3
capitalize (word) 

Questo dovrebbe fare. Ho capito diversamente.

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

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

mytext = u'i sono un bazbar foobar'

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) 

Emette

I am a Foobar Bazbar 
+0

Non è quello che voglio. Voglio ottenere "I am a Foobar Bazbar" – yassin

+0

@Yassin Ezbakhe: Modificato la mia risposta, questo dovrebbe funzionare per voi. L'elenco degli articoli può essere facilmente rimosso da qualsiasi dizionario – pyfunc

1
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 cap parola in corsivo e che non corrisponde all'articolo.

40

Utilizzare il modulo titlecase.py! Funziona solo per l'inglese.

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

Il modulo titlecase non funziona se la stringa che stai convertendo contiene un numero in qualsiasi punto. – Troy

+1

@Troy sembra che il problema del numero sia stato risolto, oppure non ho colpito il tuo caso limite. Es .: titlecase ('one 4 two') -> 'One 4 Two'. Ora titlecase ('1one') -> '1one', ma '1one'.title() ->' 1One '. sebbene questo caso successivo sia un caso limite e non sono sicuro che "1One" sia il titolo corretto. Inoltre non sono abbastanza interessato ad afferrare il mio libro di grammatica. –

+0

Non funziona nel caso di "321 A BROADWAY STREET" dove ottengo "321 a Broadway Street". Utilizzando la soluzione proposta dal dheerosaur sopra produce "321 A Broadway Street". – MoreScratch

9

Stuart Colville has made a Python port di a Perl script written by John Gruber per convertire le stringhe in caso titolo, ma evita di capitalizzare le piccole parole in base alle regole del manuale del New York Times di stile, nonché di ristorazione per diversi casi particolari .

Alcuni la bravura di questi script:

  • che capitalizza piccole parole come se, in, di, il, ecc, ma li non-capitalizzare se sono erroneamente capitalizzati in l'input.

  • gli script presuppongono che le parole con lettere maiuscole diverse dal primo carattere siano già in maiuscolo correttamente. Ciò significa che lasceranno una parola come "iTunes" da solo, invece di ridurla in "ITunes" o, peggio, "Itunes".

  • saltano su qualsiasi parola con punti linea; "Example.com" e "del.icio.us" rimarranno in minuscolo.

  • hanno hack hard-coded specificamente a trattare i casi dispari, come “AT & T” e “Q & A”, entrambi i quali contengono piccole parole (ae a) che normalmente dovrebbe essere minuscola.

  • La prima e l'ultima parola del titolo sono sempre in maiuscolo, quindi l'input come "Nothing to be fear of" verrà trasformato in "Nothing to Be Afraid Of".

  • Una piccola parola dopo i due punti sarà in maiuscolo.

È possibile scaricarlo here.

3

Il metodo del titolo di Python 2.7 ha un difetto.

value.title() 

sarà tornare Carpenter 'S Assistant quando il valore è Carpenter' s Assistente

La soluzione migliore è probabilmente quella da @BioGeek utilizzando Titlecase da Stuart Colville. Qual è la stessa soluzione proposta da @ Etienne.

0

One-liner utilizzando l'elenco comprensione 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) 

Ripartizione:

for word in "Wow, a python one liner for titles".split(" ") suddivide la stringa in un elenco e avvia un ciclo for (nell'elenco comprehenstion)

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

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

Problemi correlati