Как прописать первую букву каждого слова в строке (Python)?
s = 'the brown fox'
... Сделайте что-нибудь здесь...
s
должно быть :
'The Brown Fox'
какой самый простой способ сделать это?
15 ответов
на .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"
на .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"
С документы python на capwords:
разделите аргумент на слова, используя str.split (), с заглавной буквы каждое слово, используя str.capitalize () и присоединиться к заглавным словам, используя 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())
используйте регулярное выражение, чтобы соответствовать началу строки или пробелу, разделяющему слова, плюс один символ без пробелов; используйте круглые скобки, чтобы отметить "группы соответствия". Напишите функцию, которая принимает объект 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()
для получения окончательного результата!
копировать-вставить-готовая версия @jibberia anwser:
def capitalize(line):
return ' '.join(s[:1].upper() + s[1:] for s in line.split(' '))
почему вы усложняете свою жизнь соединениями и циклами, когда решение простое и безопасное??
просто сделать это:
string = "the brown fox"
string[0].upper()+string[1:]
If 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 anwser:
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])