Как написать первую букву каждого слова в строке заглавными буквами?

s = 'the brown fox'

...сделайте что-нибудь здесь...

s должно быть:

'The Brown Fox'

Какой самый простой способ сделать это?

Решение

Метод .title() строки (ASCII или Unicode) делает это:

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

Однако, как отмечается в документации, обратите внимание на строки со встроенными апострофами.

Алгоритм использует простое, не зависящее от языка определение слова как группы последовательных букв. Это определение работает во многих контекстах, но оно означает, что апострофы в сокращениях и посессивах формируют границы слов, что может быть нежелательным результатом:

"они'друзья Билла'а из Великобритании".title() "They'Re Bill'S Friends From The Uk"

Комментарии (6)

В .название() метод может'т работы хорошо,

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

Попробуйте строки.capwords() Метод,

import string
string.capwords("they're bill's friends from the UK")
>>>"They're Bill's Friends From The Uk"

От в Python Docs на capwords:

разделить аргумент на слова с помощью функции STR.сплит(), начинать каждое слово с помощью STR.оприходование(), и присоединиться к Слова, написанные заглавными буквами, используя стр.присоединиться(). Если необязательный второй аргумент сентября отсутствует или никто, бежит из пробельные символы заменяются одиночным пробелом, а начальные и конечные пробелы удаляются, в противном случае сентября используется, чтобы разбить и присоединиться к словам.

Комментарии (3)

Просто потому, что подобные вещи меня забавляют, вот еще два решения.

Разделите на слова, выделите инициалами каждое слово из разделенных групп и снова соедините. Это изменит белое пространство, разделяющее слова, на одно белое пространство, независимо от того, каким оно было.

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

EDIT: Я не помню, о чем я думал, когда писал вышеприведенный код, но нет необходимости строить явный список; мы можем использовать выражение генератора, чтобы сделать это ленивым способом. Так что вот лучшее решение:

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

Используйте регулярное выражение для поиска начала строки или пробела, разделяющего слова, плюс одного символа, не являющегося пробелом; используйте круглые скобки для обозначения "группы совпадений". Напишите функцию, которая принимает объект match и возвращает группу соответствия пробелов без изменений и группу соответствия не пробельных символов в верхнем регистре. Затем используйте re.sub() для замены шаблонов. Это решение не имеет проблем с пунктуацией, как первое решение, и не переделывает пробелы, как мое первое решение. Это решение дает наилучший результат.

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"

Я рад, что изучил этот ответ. Я понятия не имел, что re.sub() может принимать функцию! Вы можете выполнять нетривиальную обработку внутри re.sub() для получения конечного результата!

Комментарии (5)

Здесь's в резюме разных способов сделать это, они будут работать для всех этих входов:

""           => ""       
"a b c"      => "A B C"             
"foO baR"    => "FoO BaR"      
"foo    bar" => "Foo    Bar"   
"foo's bar"  => "Foo's Bar"    
"foo's1bar"  => "Foo's1bar"    
"foo 1bar"   => "Foo 1bar"     

- Самое простое решение-разделить предложение на слова и выделить первую букву затем соединить их вместе:

# Be careful with multiple spaces, and empty strings
# for empty words w[0] would cause an index error, 
# but with w[:1] we get an empty string as desired
def cap_sentence(s):
  return ' '.join(w[:1].upper() + w[1:] for w in s.split(' ')) 

- Если вы Don'т хотим, чтобы разбить входную строку на слова, и через фантазии генераторы:

# Iterate through each of the characters in the string and capitalize 
# the first char and any char after a blank space
from itertools import chain 
def cap_sentence(s):
  return ''.join( (c.upper() if prev == ' ' else c) for c, prev in zip(s, chain(' ', s)) )

- Или без импорта модуле itertools:

def cap_sentence(s):
  return ''.join( (c.upper() if i == 0 or s[i-1] == ' ' else c) for i, c in enumerate(s) )

- Или вы можете использовать регулярные выражения, от steveha'ы ответ:

# match the beginning of the string or a space, followed by a non-space
import re
def cap_sentence(s):
  return re.sub("(^|\s)(\S)", lambda m: m.group(1) + m.group(2).upper(), s)

Вот некоторые другие ответы, которые были учтены, и материалов, для которых они не'т работать должным образом, если мы используем определение слова в начале предложения, или что-нибудь через пробел:

  return s.title()

# Undesired outputs: 
"foO baR"    => "Foo Bar"        
"foo's bar"  => "Foo'S Bar"  
"foo's1bar"  => "Foo'S1Bar"      
"foo 1bar"   => "Foo 1Bar"       

  return ' '.join(w.capitalize() for w in s.split())    
  # or
  import string
  return string.capwords(s)

# Undesired outputs:
"foO baR"    => "Foo Bar"      
"foo    bar" => "Foo Bar"      

используя ' ' для раскола будет исправить второй выход, но capwords() по-прежнему выиграла't работа для первого

  return ' '.join(w.capitalize() for w in s.split(' '))    
  # or
  import string
  return string.capwords(s, ' ')

# Undesired outputs:
"foO baR"    => "Foo Bar"      

Будьте осторожны с несколькими пробелами

  return ' '.join(w[0].upper() + w[1:] for w in s.split())
# Undesired outputs:
"foo    bar" => "Foo Bar"                 
Комментарии (4)

Копипаст-готовая версия @ответить jibberia:

def capitalize(line):
    return ' '.join(s[:1].upper() + s[1:] for s in line.split(' '))
Комментарии (6)

Зачем вы усложняете свою жизнь с соединениями и для петли, когда решение простое и безопасное??

Просто сделать это:

string = "the brown fox"
string[0].upper()+string[1:]
Комментарии (7)

Если str.title() не работает, сделайте капитализацию самостоятельно.

  1. Разделите строку на список слов
  2. Заглавьте первую букву каждого слова
  3. Объедините слова в одну строку

Односложные слова:

>>> ' '.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"

Наглядный пример:

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)
Комментарии (1)

Если только вы хотите первое письмо: ``питон

'Привет мир'.оприходование() 'Привет мир' Но капитализировать каждое слово: питон 'Привет мир'.название() 'Привет Мир' ``

Комментарии (0)

Пустая строка вызовет ошибку, если вы Доступ [1:], поэтому я хотел бы использовать:

def my_uppercase(title):
    if not title:
       return ''
    return title[0].upper() + title[1:]

прописной только первую букву.

Комментарии (3)

Как Марк указал, вы должны использовать .название():

"MyAwesomeString".title()

Однако, если хотите сделать первую букву заглавной в шаблоне Джанго, вы могли бы использовать это:

{{ "MyAwesomeString"|title }}

или используя переменную:

{{ myvar|title }}
Комментарии (0)

Чтобы использовать слова...

str = "this is string example....  wow!!!";
print "str.title() : ", str.title();

@Комментарий Gary02127, ниже Решение название работы с апострофом

import re

def titlecase(s):
    return re.sub(r"[A-Za-z]+('[A-Za-z]+)?", lambda mo: mo.group(0)[0].upper() + mo.group(0)[1:].lower(), s)

text = "He's an engineer, isn't he? SnippetBucket.com "
print(titlecase(text))
Комментарии (3)

Предложенный метод STR.название() не работает во всех случаях. Например:

string = "a b 3c"
string.title()
> "A B 3C"

вместо"А Б 3С"` в.

Я думаю, лучше сделать что-то вроде этого:

def capitalize_words(string):
    words = string.split(" ") # just change the split(" ") method
    return ' '.join([word.capitalize() for word in words])

capitalize_words(string)
>'A B 3c'
Комментарии (1)

Дон'т игнорировать сохранение белого пространства. Если вы хотите, чтобы процесс 'Фред Флинстоун' и вы'Фред Флинстоун' вместо `'Фред Флинстоун' вы'вэ поврежден ваш пробел. Некоторые из вышеуказанных решений потеряете белое пространство. Здесь'ы решение, что's хорошо для Python 2 и 3 и сохраняет пустое пространство.

def propercase(s):
    return ''.join(map(''.capitalize, re.split(r'(\s+)', s)))
Комментарии (0)

В случае, если вы хотите сократить

 #Assuming you are opening a new file   
 with open(input_file) as file:
     lines = [x for x in reader(file) if x]
 #for loop to parse the file by line
 for line in lines:
           name = [x.strip().lower() for x in line if x]
           print(name) #check the result
Комментарии (0)

Хотя все ответы уже удовлетворительное, но я'будете стараемся охватить 2 дополнительных случаях наряду со всем предыдущем случае.

если пространство не однородное и вы хотите поддерживать один и тот же

string = hello    world i  am    here.

если все строки не начинаем с алфавита

string = 1 w 2 r 3g

Здесь вы можете использовать это

def solve(s):
    a = s.split(' ')
    for i in range(len(a)):
        a[i]= a[i].capitalize()
    return ' '.join(a)

это даст вам

output = Hello    World I  Am    Here
output = 1 W 2 R 3g

Я надеюсь, что это будет далеко не лишним.

Комментарии (0)

Мне очень нравится этот ответ:

Копипаст-готовая версия @ответить jibberia:

def capitalize(line):
    return ' '.join([s[0].upper() + s[1:] for s in line.split(' ')])

Но некоторые строки, которые я посылал отколоть какие-то пустые '' символы, которые вызваны ошибками при попытке сделать с[1:]. Нет, наверное, лучшего способа сделать это, но мне пришлось добавить в если LEN(Ы) и gt;0, так как в

return ' '.join([s[0].upper() + s[1:] for s in line.split(' ') if len(s)>0])
Комментарии (1)