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's friends from the UK".title() "They'Re Bill'S Friends From The Uk"
" ".join(w.capitalize() for w in s.split())
"e g 3b"
желаемый результат будет"E G 3b"
. Однако"e g 3b".title()
возвращается"E G 3B"
.In [2]: 'tEst'.title() Out[2]: 'Test'
.title()
Метод не может хорошо работать,Попробуй
string.capwords()
метод,Из документации по питону на заглавных словах :
источник
"There once was a string with an 'that had words right after it and then closed'"
. В этом примере все миры, за исключениемthat
заглавных, как и ожидалось. Результаты были"There Once Was A String With An 'that Had Words Right After It And Then Closed'"
title()
в обычных ситуациях. В моей ситуацииtitle()
возвращает неверный вывод для имен с акцентом или диерезисом, при этомcapwords()
обрабатывается правильно.Просто потому, что мне это нравится, вот еще два решения.
Разделите на слова, начальное заглавие каждого слова из разделенных групп и воссоединиться. Это изменит пробел, разделяющий слова на один пробел, независимо от того, что это было.
РЕДАКТИРОВАТЬ: я не помню, о чем я думал, когда писал вышеупомянутый код, но нет необходимости создавать явный список; мы можем использовать выражение генератора, чтобы сделать это ленивым способом. Итак, вот лучшее решение:
Используйте регулярное выражение для сопоставления начала строки или пробела, разделяющего слова, плюс один непробельный символ; используйте круглые скобки, чтобы пометить «группы соответствия». Напишите функцию, которая принимает объект сопоставления и возвращает группу совпадений с пробелами без изменений и группу сопоставления непробельных символов в верхнем регистре. Затем используйте
re.sub()
для замены шаблонов. У этого нет проблем пунктуации первого решения, и при этом это не переделывает пробел как мое первое решение. Этот дает лучший результат.Я рад, что исследовал этот ответ. Я понятия не имел, что
re.sub()
может взять на себя функцию! Вы можете сделать нетривиальную обработку внутри,re.sub()
чтобы получить конечный результат!источник
string.capwords
, что делает, согласно документации в ответе Чэнь Хоуу.Вот краткое изложение различных способов сделать это, они будут работать для всех этих входных данных:
- Самое простое решение - разделить предложение на слова и использовать заглавную букву, а затем соединить его вместе:
- Если вы не хотите сначала разбивать входную строку на слова и использовать необычные генераторы:
- Или без импорта itertools:
- Или вы можете использовать регулярные выражения из ответа Стивехи :
Теперь, это некоторые другие ответы, которые были опубликованы, и входные данные, для которых они не работают должным образом, если мы используем определение слова, являющегося началом предложения или чего-либо после пробела:
использование '' для разбиения исправит второй вывод, но capwords () все равно не будет работать для первого
Будьте осторожны с несколькими пробелами
источник
lower 123 upper
должно возвращатьсяlower 123 Upper
, гдеupper
заглавная, как следует за числом. Я знаю, что это выходит за рамки вопроса ОП, но является хорошим дополнением к вашему уже обширному ответу. Заранее спасибо."([0-9]+)(\s+.)"
вместо"(^|\s)(\S)"
(совпадение с одним или несколькими числами, после которых следуют один или несколько пробелов и любой символ после), или"([0-9]+)(\s*.)"
если вы хотите использовать символ с большой буквы после пробела «ноль или более» после числоWW1 - the great war
и вывелиWW1 - The Great War
вместоWw1 ...
. Видите проблему с сокращениями? Хотели бы вы добавить что-то, что демонстрирует этот случай? Я долго размышлял об этом и не могу придумать, как это сделать.WW1
выводятся какWW1
Готовая к копированию и вставке версия @jibberia anwser:
источник
str.join
принимает генераторы.join
принимает gen exps, вstr.join
частности, обычно предпочтительнее использовать понимание списка. Это связано с тем,join
что аргумент проходит дважды по аргументу, и, следовательно, быстрее создать готовый список, а не генератор.str.join
нужно дважды повторять аргумент? Я только что проверил - это не так. Хотя для небольших последовательностей понимание списка действительно быстрее.Почему вы усложняете свою жизнь соединениями и циклами, когда решение простое и безопасное?
Просто сделай это:
источник
"the brown fox".capitalize()
?'this is John'
в'This is john'
.string.capitalize()
(по сути, повторяя @luckydonald)Если str.title () не работает для вас, сделайте капитализацию самостоятельно.
Один лайнер:
Наглядный пример:
источник
Если только вы хотите первую букву:
Но, чтобы извлечь выгоду из каждого слова:
источник
'hello New York'.capitalize()
это'Hello new york'
Пустая строка вызовет ошибку, если вы получите доступ к [1:], поэтому я бы использовал:
в верхнем регистре только первая буква.
источник
str.capitalize
?return title[:1].upper() + title[1:]
также позаботился бы об этой проблеме, так как разрезание пустой строки, как это, дало бы 2 пустые строки, соединенные вместе, чтобы создать пустую строку, которая возвращаетсяКак отметил Марк, вы должны использовать
.title()
:Однако, если вы хотите сделать первую букву заглавной в шаблоне django , вы можете использовать это:
или используя переменную:
источник
Предложенный метод str.title () работает не во всех случаях. Например:
вместо
"A B 3c"
.Я думаю, что лучше сделать что-то вроде этого:
источник
Хотя все ответы уже удовлетворительные, но я постараюсь охватить 2 дополнительных случая вместе со всем предыдущим.
Здесь вы можете использовать это
это даст вам
Я надеюсь, что это не избыточно.
источник
Чтобы использовать слова ...
@ Gary02127 комментарий, ниже название работы решения с апострофом
источник
Не забывайте о сохранении пустого пространства. Если вы хотите обработать,
'fred flinstone'
и вы получите'Fred Flinstone'
вместо'Fred Flinstone'
, вы испортили пустое пространство. Некоторые из вышеуказанных решений потеряют пустое пространство. Вот решение, которое хорошо для Python 2 и 3 и сохраняет пустое пространство.источник
Быстрая функция работала для Python 3
источник
Строка с заглавными буквами с неравномерными пробелами
Ну, я понимаю, что это старый вопрос, и, возможно, ответы на него, возможно, были почти исчерпаны, но я хотел бы добавить к точке @Amit Gupta неравномерных пространств. Исходя из исходного вопроса, мы хотели бы использовать каждое слово в строке с большой буквы
s = 'the brown fox'
. Что делать, если строка былаs = 'the brown fox'
с неоднородными пробелами.источник
** В случае, если вы хотите уменьшить **
источник
Мне очень нравится этот ответ:
Готовая к копированию и вставке версия @jibberia anwser:
Но некоторые строки, которые я отправлял, отделяли некоторые пустые символы '', которые вызывали ошибки при попытке сделать s [1:]. Вероятно, есть лучший способ сделать это, но мне пришлось добавить в if len (s)> 0, как в
источник