s = 'the brown fox'
... сделайте что-нибудь здесь...
s должен быть:
'The Brown Fox'
Какой самый простой способ сделать это?
s = 'the brown fox'
... сделайте что-нибудь здесь...
s должен быть:
'The Brown Fox'
Какой самый простой способ сделать это?
.title() метод строки (либо ASCII, либо Unicode в порядке) делает следующее:
>>> "hello world".title()
'Hello World'
>>> u"hello world".title()
u'Hello World'
Однако обратите внимание на строки со встроенными апострофами, как указано в документах.
В алгоритме используется простое независимое от языка определение слова как группы последовательных букв. Определение работает во многих контекстах, но это означает, что апострофы в схватках и владениях образуют границы слов, что не может быть желаемым результатом:
>>> "they're bill friends from the UK".title() "They'Re Bill Friends From The Uk"
Метод .title() не может работать хорошо,
>>> "they're bill friends from the UK".title()
"They'Re Bill'S Friends From The Uk"
Попробуйте string.capwords()
import string
string.capwords("they're bill friends from the UK")
>>>"They're Bill Friends From The Uk"
Из документов python по ключевым словам:
Разделите аргумент на слова, используя str.split(), запишите каждое слово, используя str.capitalize(), и соедините заглавные слова, используя str.join(). Если необязательный второй аргумент sep отсутствует или None, пробелы пробельных символов заменяются одним пробелом, а удаленные пробелы ведущие и конечные удаляются, иначе sep используется для разделения и объединения слов.
Просто потому, что для меня это весело, вот еще два решения.
Разделите слова, запишите каждое слово из разделенных групп и присоединитесь. Это изменит белое пространство, разделяющее слова, на одно пустое пространство, независимо от того, что было.
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())
Используйте регулярное выражение для соответствия началу строки или пробелу, разделяющему слова, плюс один символ без пробелов; используйте круглые скобки для обозначения "групп соответствия". Напишите функцию, которая принимает объект соответствия, и возвращает группу совпадений пробелов без изменений и группу совпадений символов без пробелов в верхнем регистре. Затем используйте 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 Friends From The UK"
Я рад, что я исследовал этот ответ. Я понятия не имел, что re.sub() может выполнять функцию! Вы можете сделать нетривиальную обработку внутри re.sub(), чтобы получить окончательный результат!
Вот краткое изложение различных способов сделать это, они будут работать для всех этих входов:
"" => ""
"a b c" => "A B C"
"foO baR" => "FoO BaR"
"foo bar" => "Foo Bar"
"foo bar" => "Foo 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(' '))
- Если вы не хотите сначала разбивать входную строку на слова и использовать необычные генераторы:
# 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 bar" => "Foo 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"
Готовая версия версии @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:]
Если str.title() не работает для вас, сделайте заглавные буквы самостоятельно.
Однострочник:
>>> ' '.join([s[0].upper() + s[1:] for s in "they're bill friends from the UK".split(' ')])
"They're Bill Friends From The UK"
Пример:
input = "they're bill 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)
Если только вы хотите первую букву:
>>> 'hello world'.capitalize()
'Hello world'
Но чтобы использовать каждое слово с заглавной буквы:
>>> 'hello world'.title()
'Hello World'
Пустая строка вызовет ошибку при доступе к [1:], поэтому я бы использовал:
def my_uppercase(title):
if not title:
return ''
return title[0].upper() + title[1:]
в верхнем регистре только первая буква.
Как отметил Марк, вы должны использовать .title():
"MyAwesomeString".title()
Однако, если вы хотите сделать первую букву в верхнем регистре внутри шаблона django, вы можете использовать это:
{{ "MyAwesomeString"|title }}
или используя переменную:
{{ myvar|title }}
Чтобы заглавные слова...
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 an engineer, isn't he? SnippetBucket.com "
print(titlecase(text))
Предложенный метод str.title() работает не во всех случаях. Например:
string = "a b 3c"
string.title()
> "A B 3C"
вместо "AB 3c".
Я думаю, что лучше сделать что-то вроде этого:
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'
Не забывайте о сохранении пробелов. Если вы хотите обработать '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
Хотя все ответы уже удовлетворительные, но я постараюсь охватить 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
Я надеюсь, что это не избыточно.
Мне очень нравится этот ответ:
Готовая версия версии @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])