Ako písať veľké písmená na začiatku každého slova v reťazci?

s = 'the brown fox'

...urobte niečo tu...

s by malo byť :

'The Brown Fox'

Aký'je najjednoduchší spôsob, ako to urobiť?

Riešenie

Metóda .title() reťazca (ASCII alebo Unicode je v poriadku) to robí:

>>> "hello world".title()
'Hello World'
>>> u"hello world".title()
u'Hello World'

Pozor však na reťazce s vloženými apostrofmi, ako je uvedené v dokumentoch.

Algoritmus používa jednoduchú definíciu slova ako skupiny po sebe idúcich písmen nezávislú od jazyka. Táto definícia funguje v mnohých kontextoch, ale znamená to, že apostrofy v spojeniach a posesívach tvoria hranice slov, čo nemusí byť požadovaný výsledok:

"they're bill's friends from the UK".title() "They'Re Bill'S Friends From The Uk"

Komentáre (6)

Pretože ma takéto veci bavia, tu sú ďalšie dve riešenia.

Rozdeľte sa na slová, každé slovo z rozdelených skupín parafujte a znovu spojte. Tým sa zmení biela medzera oddeľujúca slová na jednu bielu medzeru bez ohľadu na to, aká bola.

s = 'the brown fox'
lst = [word[0].upper() + word[1:] for word in s.split()]
s = " ".join(lst)

EDIT: Nepamätám si, čo som si myslel, keď som písal vyššie uvedený kód, ale nie je potrebné vytvárať explicitný zoznam; môžeme použiť generátorový výraz, ktorý to urobí lenivým spôsobom. Takže tu je lepšie riešenie:

s = 'the brown fox'
s = ' '.join(word[0].upper() + word[1:] for word in s.split())

Použite regulárny výraz na porovnanie začiatku reťazca alebo bielej medzery oddeľujúcej slová a jedného znaku, ktorý nie je biela medzera; použite zátvorky na označenie "match groups". Napíšte funkciu, ktorá prevezme objekt match a vráti skupinu match s bielym medzerníkom bez zmeny a skupinu match so znakom, ktorý nie je bielym medzerníkom, vo veľkých písmenách. Potom použite re.sub() na nahradenie vzorov. Toto riešenie nemá problémy s interpunkciou ako prvé riešenie, ani neopravuje biele miesta ako moje prvé riešenie. Toto riešenie poskytuje najlepší výsledok.

import re
s = 'the brown fox'

def repl_func(m):
    """process regular expression match groups for word upper-casing problem"""
    return m.group(1) + m.group(2).upper()

s = re.sub("(^|\s)(\S)", repl_func, s)

>>> re.sub("(^|\s)(\S)", repl_func, s)
"They're Bill's Friends From The UK"

Som rád, že som túto odpoveď preskúmal. Netušil som, že re.sub() môže prijať funkciu! Vo vnútri funkcie re.sub() môžete vykonať netriviálne spracovanie, aby ste získali konečný výsledok!

Komentáre (5)

Ak vám str.title() nefunguje, napíšte veľké písmená sami.

  1. Rozdeľte reťazec na zoznam slov
  2. V každom slove napíšte prvé veľké písmeno
  3. Spojte slová do jedného reťazca

Jednoslovný výraz:

>>> ' '.join([s[0].upper() + s[1:] for s in "they're bill's friends from the UK".split(' ')])
"They're Bill's Friends From The UK"

Jasný príklad:

input = "they're bill's friends from the UK"
words = input.split(' ')
capitalized_words = []
for word in words:
    title_case_word = word[0].upper() + word[1:]
    capitalized_words.append(title_case_word)
output = ' '.join(capitalized_words)
Komentáre (1)