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
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
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ć.
artykułów na temat lowlazy titlecase.py. –
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
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.
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'
Moduł titlecase nie działa, jeśli konwertowany ciąg zawiera numer w dowolnym miejscu. – Troy
@ 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. –
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
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.
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.
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)
+1 dla przypadku "zdanie zaczynające się od artykułu" – yassin
Dlaczego 're' jest niezbędne? Istnieje funkcja "" ".split", która robi to samo. – wizzwizz4
@ wizzwizz4: 'str.split' nie uwzględnia ciągłych spacji. 're.split' zachowuje spacje. Funkcja ta nie pochłania żadnych spacji. – dheerosaur