Как прописать первую букву каждого слова в строке (Python)?



s = 'the brown fox'


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



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



'The Brown Fox'


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

1829   15  

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"

С python docs на capwords:

разделить аргумент на слова с помощью 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 () Не работает для вас, сделайте капитализацию самостоятельно.

  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)

вот краткое изложение различных способов сделать это:

самое простое решение-разделить предложение на слова и заглавную букву, а затем соединить его вместе.

# 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

    Ничего не найдено.