15 ответов:
The
.title()метод строки (либо ASCII или Unicode отлично) делает это:>>> "hello world".title() 'Hello World' >>> u"hello world".title() u'Hello World'однако, обратите внимание на строки со встроенными апострофами, как указано в документах.
алгоритм использует простое независимое от языка определение слова как группы последовательных букв. Определение работает во многих контекстах, но это означает, что апострофы в сокращениях и владениях образуют границы слов, которые могут быть нежелательными результат:
>>> "they're bill's friends from the UK".title() "They'Re Bill'S Friends From The Uk"
The
.title()метод не может хорошо работать,>>> "they're bill's friends from the UK".title() "They'Re Bill'S Friends From The Uk"попробовать
string.capwords()методimport string string.capwords("they're bill's friends from the UK") >>>"They're Bill's Friends From The Uk"разделить аргумент на слова с помощью str.split (), заглавные буквы каждого слова с помощью str.оприходование(), и присоединиться к Слова, написанные заглавными буквами, используя стр.присоединяться.)( Если необязательный второй аргумент sep отсутствует или отсутствует, пробельные символы заменяются одним пробелом и начальные и конечные пробелы удаляются, в противном случае sep используется для разделения и объединения слов.
просто потому, что это забавно для меня, вот еще два решения.
разделить на слова, начальная шапка каждое слово из разделенных групп, и воссоединиться. Это изменит белое пространство, разделяющее слова в одно белое пространство, независимо от того, что это было.
s = 'the brown fox' lst = [word[0].upper() + word[1:] for word in s.split()] s = " ".join(lst)
EDIT: я не помню, о чем я думал, когда писал приведенный выше код, но нет необходимости создавать явный список; мы можем использовать выражение генератора для этого в lazy мода. Так вот лучшее решение:
s = 'the brown fox' s = ' '.join(word[0].upper() + word[1:] for word in s.split())
используйте регулярное выражение, чтобы соответствовать началу строки, или пробел, разделяющий слова, плюс один символ без пробелов; используйте круглые скобки, чтобы отметить "группы соответствия". Напишите функцию, которая принимает объект соответствия и возвращает группу соответствия пробелов без изменений и группу соответствия символов без пробелов в верхнем регистре. Тогда используйте
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()чтобы получить окончательный результат!
скопировать-вставить готовый вариант @ответить jibberia:
def capitalize(line): return ' '.join(s[:1].upper() + s[1:] for s in line.split(' '))
почему вы усложняете свою жизнь соединениями и циклами, когда решение простое и безопасное??
просто сделать это:
string = "the brown fox" string[0].upper()+string[1:]
Если STR.title () Не работает для вас, сделайте капитализацию самостоятельно.
- разделить строку на список слов
- заглавная первая буква каждого слова
- объединить слова в одну строку
одну строчку:
>>> ' '.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)
вот краткое изложение различных способов сделать это:
самое простое решение-разделить предложение на слова и заглавную букву, а затем соединить его вместе.
# 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(' '))если вы не хотите сначала разделить входную строку на слова и использовать причудливые генераторы:
# 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)они будут работать для всех этих входов:
"" => "" "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"
теперь, это некоторые другие ответы которые были опубликованы, и входы, для которых они не работают, как ожидалось, если мы используем определение слова, являющегося началом предложения или что-либо после пустого места:
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 () все равно не будет работать для первый
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"
пустая строка вызовет ошибку при доступе к [1:], поэтому я бы использовал:
def my_uppercase(title): if not title: return '' return title[0].upper() + title[1:]только в верхнем регистре первой буквы.
как отметил Марк, вы должны использовать
.title():"MyAwesomeString".title()однако, если бы хотели сделать первую букву прописной внутри шаблона django, вы могли бы использовать это:
{{ "MyAwesomeString"|title }}или с помощью переменной:
{{ myvar|title }}
предложенный метод str.title () работает не во всех случаях. Например:
string = "a b 3c" string.title() > "A B 3C"вместо
"A B 3c".Я думаю, лучше сделать что-то вроде этого:
def capitalize_words(string): words = string.split() return ' '.join([word.capitalize() for word in words]) capitalize_words(string) >'A B 3c'
заглавные слова...
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))
Не забывайте о сохранении белого пространства. Если вы хотите обработать
'fred flinstone'и вы'Fred Flinstone'вместо'Fred Flinstone', вы испортили ваше пустое пространство. Некоторые из вышеперечисленных решений потеряют белое пространство. Вот решение, которое хорошо подходит для Python 2 и 3 и сохраняет пустое пространство.def propercase(s): return ''.join(map(''.capitalize, re.split(r'(\s+)', s)))
Если только вы хотите первую букву: 'Привет мир'.капитализировать() Выход: Привет, мир
но прописными буквами каждое слово: 'Привет мир'.заглавие:() Выход: Привет, мир
**в случае, если вы хотите сократить **
#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
мне очень нравится этот ответ:
скопировать-вставить готовый вариант @ответить jibberia:
def capitalize(line): return ' '.join([s[0].upper() + s[1:] for s in line.split(' ')])но некоторые из строк, которые я отправлял, откололи некоторые пустые символы, которые вызвали ошибки при попытке сделать s[1:]. Вероятно, есть лучший способ сделать это, но мне пришлось добавить в if len (s)>0, как в
return ' '.join([s[0].upper() + s[1:] for s in line.split(' ') if len(s)>0])
Comments