s = 'the brown fox'
... zrób coś tutaj ...
s
Powinien być :
'The Brown Fox'
Jak najłatwiej to zrobić?
python
capitalization
capitalize
TIMEX
źródło
źródło
" ".join(w.capitalize() for w in s.split())
"e g 3b"
pożądany wynik będzie"E G 3b"
. Jednak"e g 3b".title()
powraca"E G 3B"
.In [2]: 'tEst'.title() Out[2]: 'Test'
.title()
Metoda nie może działać dobrze,Wypróbuj
string.capwords()
metodęZ dokumentacji Pythona na temat haseł :
źródło
"There once was a string with an 'that had words right after it and then closed'"
. W tym przykładzie wszystkie światy z wyjątkiemthat
są kapitalizowane zgodnie z oczekiwaniami. Rezultat jest"There Once Was A String With An 'that Had Words Right After It And Then Closed'"
title()
w normalnych sytuacjach. W mojej sytuacjititle()
zwraca zły wynik dla nazw z akcentami lub dieresis, gdy jestcapwords()
obsługiwany poprawnie.Tylko dlatego, że tego rodzaju zabawa sprawia mi przyjemność, oto dwa kolejne rozwiązania.
Podziel na słowa, napisz początkowo każde słowo z podzielonych grup i dołącz ponownie. Spowoduje to zmianę białej przestrzeni oddzielającej słowa na jedną białą spację, bez względu na to, co to było.
EDYCJA: Nie pamiętam, o czym myślałem, kiedy pisałem powyższy kod, ale nie ma potrzeby budowania wyraźnej listy; możemy użyć wyrażenia generatora, aby zrobić to leniwie. Oto lepsze rozwiązanie:
Użyj wyrażenia regularnego, aby dopasować początek łańcucha lub spacji oddzielających słowa, a także pojedynczego znaku spacji; użyj nawiasów, aby zaznaczyć „dopasuj grupy”. Napisz funkcję, która pobiera obiekt dopasowania i zwraca niezmienioną grupę dopasowań białych znaków oraz grupę dopasowań znaków niebiałych dużymi literami. Następnie użyj,
re.sub()
aby zastąpić wzory. Ten nie ma problemów z interpunkcją pierwszego rozwiązania, ani nie przerabia białej przestrzeni jak moje pierwsze rozwiązanie. Ten daje najlepszy wynik.Cieszę się, że zbadałem tę odpowiedź. Nie miałem pojęcia, że
re.sub()
może przyjąć jakąś funkcję! Możesz wykonać nietrywialne przetwarzanie wre.sub()
celu uzyskania ostatecznego rezultatu!źródło
string.capwords
jest, zgodnie z dokumentacją zawartą w odpowiedzi Chen Houwu.Oto podsumowanie różnych sposobów, aby to zrobić, będą działać dla wszystkich tych danych wejściowych:
- Najprostszym rozwiązaniem jest podzielenie zdania na słowa i zapisanie pierwszej litery wielką literą, a następnie połączenie jej z powrotem:
- Jeśli nie chcesz najpierw podzielić łańcucha wejściowego na słowa i używając fantazyjnych generatorów:
- Lub bez importowania itertools:
- Lub możesz użyć wyrażeń regularnych z odpowiedzi Stevehy :
Oto niektóre inne odpowiedzi, które zostały opublikowane, i dane wejściowe, dla których nie działają zgodnie z oczekiwaniami, jeśli używamy definicji słowa będącego początkiem zdania lub czegokolwiek po spacji:
użycie '' do podziału naprawi drugie wyjście, ale capwords () nadal nie będzie działać dla pierwszego
Uważaj na wiele pustych miejsc
źródło
lower 123 upper
Powinien powrócićlower 123 Upper
, gdzieupper
litera jest pisana wielkimi literami, ponieważ następuje po niej liczba. Wiem, że wykracza to poza zakres pytania PO, ale stanowi miły dodatek do już i tak obszernej odpowiedzi. Z góry dziękuję."([0-9]+)(\s+.)"
zamiast tego"(^|\s)(\S)"
(dopasuj jedną lub więcej liczb, a następnie jedną lub więcej spacji i dowolne"([0-9]+)(\s*.)"
znaki po ), lub jeśli chcesz wstawić znak po „zerach lub więcej” spacji po liczbaWW1 - the great war
I wyjścieWW1 - The Great War
zamiastWw1 ...
. Widzisz problem ze skrótami? Czy byłbyś skłonny dodać coś, co pokazuje ten przypadek? Zastanawiam się nad tym od dłuższego czasu i nie mogę wymyślić sposobu, aby to zrobić.WW1
będzie odtwarzany jakoWW1
Wersja @jibberia gotowa do skopiowania i wklejenia:
źródło
str.join
akceptuje generatory.join
akceptuje generacje, wstr.join
szczególności szczególnie preferowane jest używanie listowania . Wynika to z tego, żejoin
iteruje się dwa razy w stosunku do argumentu, a zatem szybsze jest dostarczenie gotowej listy niż generatora.str.join
trzeba powtarzać dwukrotnie argument? Właśnie sprawdziłem - nie ma. Jednak w przypadku małych sekwencji zrozumienie listy jest rzeczywiście szybsze.Dlaczego komplikujesz swoje życie połączeniami i pętlami, gdy rozwiązanie jest proste i bezpieczne?
Po prostu zrób to:
źródło
"the brown fox".capitalize()
?'this is John'
się'This is john'
.string.capitalize()
(zasadniczo echo @luckydonald)Jeśli str.title () nie działa dla Ciebie, wykonaj wielkie litery sam.
Jednowarstwowy:
Jasny przykład:
źródło
Jeśli tylko chcesz pierwszą literę:
Ale wielkie litery każdego słowa:
źródło
'hello New York'.capitalize()
to'Hello new york'
Pusty ciąg wywoła błąd, jeśli uzyskasz dostęp do [1:], dlatego użyłbym:
tylko wielką pierwszą literą.
źródło
str.capitalize
jest?return title[:1].upper() + title[1:]
będzie również dbać o ten problem, ponieważ krojenie pusty łańcuch tak dałoby 2 pustych strun, połączonych ze sobą zrobić pusty ciąg znaków, który jest zwracanyJak zauważył Mark, powinieneś użyć
.title()
:Jednak jeśli chcesz zrobić pierwszą literę w szablonie django , możesz użyć tego:
lub używając zmiennej:
źródło
Sugerowana metoda str.title () nie działa we wszystkich przypadkach. Na przykład:
zamiast
"A B 3c"
.Myślę, że lepiej zrobić coś takiego:
źródło
Chociaż wszystkie odpowiedzi są już zadowalające, ale postaram się objąć 2 dodatkowe przypadki wraz ze wszystkimi poprzednimi przypadkami.
Tutaj możesz tego użyć
to ci da
Mam nadzieję, że to nie jest zbędne.
źródło
Aby używać wielkich słów ...
@ Gary02127 komentarz, poniżej tytuł pracy rozwiązania z apostrofem
źródło
Nie zapomnij o zachowaniu białej przestrzeni. Jeśli chcesz przetworzyć,
'fred flinstone'
a'Fred Flinstone'
zamiast tego'Fred Flinstone'
dostajesz, uszkodziłeś swoją białą przestrzeń. Niektóre z powyższych rozwiązań utracą białe miejsca. Oto rozwiązanie, które jest dobre dla Python 2 i 3 i pozwala zachować białe znaki.źródło
Szybka funkcja działała w Pythonie 3
źródło
Łańcuch należy pisać wielkimi niejednolitymi spacjami
Rozumiem, że to stare pytanie i prawdopodobnie odpowiedzi zostały prawie wyrzucone z równowagi, ale chciałbym dodać do punktu niejednolitych przestrzeni @Amit Gupta. Z pierwotnego pytania chcielibyśmy używać każdego słowa w ciągu
s = 'the brown fox'
. Co jeśli ciąg miałs = 'the brown fox'
niejednolite spacje.źródło
** W przypadku, gdy chcesz zmniejszyć rozmiar **
źródło
Naprawdę podoba mi się ta odpowiedź:
Wersja @jibberia gotowa do skopiowania i wklejenia:
Ale niektóre wiersze, które wysyłałem, oddzielały puste znaki, które powodowały błędy podczas próby wykonania s [1:]. Prawdopodobnie jest na to lepszy sposób, ale musiałem dodać if len (s)> 0, jak w
źródło