2010-09-16 10 views
62

Czy istnieje standardowy sposób w Pythonie do titlecase ciąg (to słowa zaczynają się wielkimi literami, wszystkie pozostałe obudowane znaki mają małe litery), ale pozostawiając artykuły jak and, in, a of małe litery?Titlecasing ciąg z wyjątkami

Odpowiedz

116

Jest kilka problemów z tym. Jeśli użyjesz podziału i sprzężenia, niektóre spacje będą ignorowane. Wbudowane metody wielkich i wielkich liter nie ignorują białych znaków.

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

Jeśli zdanie zaczyna się od artykułu, nie chcesz, aby pierwsze słowo tytułu pisane małymi literami.

Utrzymanie tych kwestiach:

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 dla przypadku "zdanie zaczynające się od artykułu" – yassin

+0

Dlaczego 're' jest niezbędne? Istnieje funkcja "" ".split", która robi to samo. – wizzwizz4

+0

@ wizzwizz4: 'str.split' nie uwzględnia ciągłych spacji. 're.split' zachowuje spacje. Funkcja ta nie pochłania żadnych spacji. – dheerosaur

14

Są te metody:

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

Nie ma małe opcja artykuł. Będziesz musiał sam to zakodować, prawdopodobnie używając listy artykułów, które chcesz obniżyć.

+0

artykułów na temat lowlazy titlecase.py. –

3
capitalize (word) 

To powinno zrobić. Rozumiem to inaczej.

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

Ok jak powiedział w odpowiedzi powyżej, trzeba dokonać zwyczaj wykorzystać:

myText = u'i jestem 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) 

ten wyprowadza

I am a Foobar Bazbar 
+0

To nie jest to, czego chcę. Chcę uzyskać "Jestem Foobar Bazbar" – yassin

+0

@ Yassin Ezbakhe: Edytowałem odpowiedź, to powinno działać dla ciebie. Listę artykułów można łatwo usunąć z dowolnego słownika. – 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 
""" 

Tytuł zaczyna się od czapki zinterpretowane słowo i to nie pasuje do artykułu.

40

Użyj modułu titlecase.py! Działa tylko w języku angielskim.

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

Moduł titlecase nie działa, jeśli konwertowany ciąg zawiera numer w dowolnym miejscu. – Troy

+1

@ Troy wygląda na to, że problem z numerem został naprawiony, albo nie uderzyłem w Twój przypadek krawędzi. Przykład: titlecase ("jeden 4 dwa") -> "Jeden 4 dwa". Teraz titlecase ("1one") -> "1one", ale "1one'.title() ->" 1ne ". chociaż ten ostatni przypadek jest skrajnym przypadkiem i nie jestem pewien, czy "1One" to poprawna nazwa. Nie jestem też wystarczająco zajęty, aby zdobyć moją książkę gramatyki. –

+0

Nie działa w przypadku "321 A BROADWAY STREET", gdzie otrzymuję "321 a Broadway Street". Korzystanie z rozwiązania zaproponowanego przez dheerozaura powyżej daje "321 A Broadway Street". – MoreScratch

9

Stuart Colville has made a Python port z a Perl script written by John Gruber konwertować ciągi znaków na tytułowej przypadku, ale unika kapitalizacji małych słów na podstawie zasad z podręcznika New York Times stylu, jak również catering dla kilku szczególnych przypadkach .

Niektóre sprytowi tych skryptów:

  • one aktywuje małych słów jak jeśli w, z, na, itd., Ale będzie ich un-wykorzystać, jeśli są one błędnie skapitalizowane wejście.

  • Skrypty zakładają, że słowa z dużymi literami innymi niż pierwszy znak są już poprawnie napisane wielkimi literami. Oznacza to, że zostawiają słowo takie jak "iTunes", zamiast mieszać go do "ITunes" lub, co gorsza, "Itunes".

  • pomijają wszelkie wyrazy z kropkami linii; "Example.com" i "del.icio.us" pozostaną małe.

  • mają stałe zakodowana sieka szczególności do czynienia z nieparzystych przypadkach, na przykład „w & T” i Q & „A”, z których oba zawierają krótkie słowa (w a), co zwykle powinno być małe.

  • Pierwsze i ostatnie słowo tytułu są zawsze pisane wielkimi literami, więc wpis taki jak "Nic się bać" nie zostanie zmieniony na "Nic się bać".

  • Małe słowo po dwukropku będzie pisane wielką literą.

Możesz go pobrać here.

3

Metoda w tytule Pythona 2.7 ma w sobie wadę.

value.title() 

powróci cieśli S Assistant gdy wartość cieśli s Asystent

Najlepszym rozwiązaniem jest prawdopodobnie jedną z @BioGeek pomocą titlecase z Stuart Colville. To jest to samo rozwiązanie zaproponowane przez @Etienne.

0

jedną wykładzinę za pomocą listy zrozumienia i operatora trójskładnikowego

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) 

Struktura:

for word in "Wow, a python one liner for titles".split(" ") dzieli łańcuch na liście i inicjuje pętli (na liście comprehenstion)

word.title() if word not in "the a on in of an" else word używa natywnej metody title() do wpisania wielkości liter w łańcuchu, jeśli nie jest to artykuł

dołącza do elementów listy za pomocą separatora (spacji)

Powiązane problemy