如何将字符串中每个单词的首字母大写?

s = 'the brown fox'

在这里做点什么。

s应该是:

'The Brown Fox'

最简单的方法是什么?

826595 次浏览

字符串的.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"

仅仅因为这种事情对我来说很有趣,这里还有两个解决方案。

拆分为单词,从拆分的组中为每个单词加上初始上限,然后重新连接。这将改变分隔单词的空格为单个空格,无论它是什么。

s = 'the brown fox'lst = [word[0].upper() + word[1:] for word in s.split()]s = " ".join(lst)

编辑:我不记得写上面代码时我在想什么,但是没有必要构建一个显式列表;我们可以使用生成器表达式以懒惰的方式来完成它。所以这是一个更好的解决方案:

s = 'the brown fox's = ' '.join(word[0].upper() + word[1:] for word in s.split())

使用正则表达式匹配字符串的开头,或空格分隔单词,加上单个非空格字符;使用括号标记“匹配组”。编写一个函数,接受一个匹配对象,并返回空格匹配组不变,大写非空格字符匹配组。然后使用re.sub()替换模式。这个没有第一个解决方案的标点符号问题,也没有像我的第一个解决方案那样重做空格。这个产生了最好的结果。

import res = '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()中进行非平凡的处理来产生最终结果!

如果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)

@jibberia anwser的复制粘贴就绪版本:

def capitalize(line):return ' '.join(s[:1].upper() + s[1:] for s in line.split(' '))

.title()方法不能很好地工作,

>>> "they're bill's friends from the UK".title()"They'Re Bill'S Friends From The Uk"

尝试string.capwords()方法,

import stringstring.capwords("they're bill's friends from the UK")>>>"They're Bill's Friends From The Uk"

Python留档

使用str.split()将参数拆分为单词,使用str.capitalize()将每个单词大写,并使用str.join()将大写单词连接起来。如果可选的第二个参数sep不存在或无,空格字符的运行将被单个空格替换,并删除前导和尾随空格,否则sep用于拆分和连接单词。

我真的很喜欢这个答案:

@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])

大写单词…

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))

正如Mark所指出的,您应该使用.title()

"MyAwesomeString".title()

但是,如果想使第一个字母大写在django模板中,您可以使用:

\{\{ "MyAwesomeString"|title }}

或者使用变量:

\{\{ myvar|title }}

当解决方案简单而安全时,为什么你要用连接和for循环使你的生活复杂化??

只要这样做:

string = "the brown fox"string[0].upper()+string[1:]

建议的方法str.title()并非在所有情况下都有效。例如:

string = "a b 3c"string.title()> "A B 3C"

而不是"A B 3c"

我想,不如这样做:

def capitalize_words(string):words = string.split(" ") # just change the split(" ") methodreturn ' '.join([word.capitalize() for word in words])
capitalize_words(string)>'A B 3c'

以下是不同方法的总结,以及一些需要注意的陷阱

他们将为所有这些输入工作:

""           => """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"
  • 将句子分成单词并将第一个字母大写,然后将其连接在一起

     # 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 desireddef cap_sentence(s):return ' '.join(w[:1].upper() + w[1:] for w in s.split(' '))
  • 无需拆分字符串,检查空格以查找单词的开头

      def cap_sentence(s):return ''.join( (c.upper() if i == 0 or s[i-1] == ' ' else c) for i, c in enumerate(s) )
  • 或者使用发电机

      # Iterate through each of the characters in the string# and capitalize the first char and any char after a blank spacefrom itertools import chaindef cap_sentence(s):return ''.join( (c.upper() if prev == ' ' else c) for c, prev in zip(s, chain(' ', s)) )
  • 使用正则表达式,从steveha的回答

      # match the beginning of the string or a space, followed by a non-spaceimport redef cap_sentence(s):return re.sub("(^|\s)(\S)", lambda m: m.group(1) + m.group(2).upper(), s)

现在,这些是发布的一些其他答案,以及如果我们将一个单词定义为句子的开头或空格之后的任何内容,它们就无法按预期工作的输入:

  • .title()

      return s.title()
    # Undesired outputs:"foO baR"    => "Foo Bar""foo's bar"  => "Foo'S Bar""foo's1bar"  => "Foo'S1Bar""foo 1bar"   => "Foo 1Bar"

  • .capitalize().capwords()

      return ' '.join(w.capitalize() for w in s.split())# orimport stringreturn string.capwords(s)
    # Undesired outputs:"foO baR"    => "Foo Bar""foo    bar" => "Foo Bar"

    使用' '进行拆分将修复第二个输出,但不是第一个输出

      return ' '.join(w.capitalize() for w in s.split(' '))# orimport stringreturn string.capwords(s, ' ')
    # Undesired outputs:"foO baR"    => "Foo Bar"

  • .upper()

    小心使用多个空格,这可以通过使用' '进行拆分来解决(如答案顶部所示)

      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:]

只大写第一个字母。

不要忽视留白。如果你想处理'fred flinstone'而得到'Fred Flinstone'而不是'Fred Flinstone',你已经损坏了你的留白。上面的一些解决方案会丢失留白。这里有一个对Python 2和3有利并保留留白的解决方案。

def propercase(s):return ''.join(map(''.capitalize, re.split(r'(\s+)', s)))

如果你只想要第一个字母:

>>> 'hello world'.capitalize()'Hello world'

但要大写每个单词:

>>> 'hello world'.title()'Hello World'

以防你想裁员

# Assuming you are opening a new filewith open(input_file) as file:lines = [x for x in reader(file) if x]
# for loop to parse the file by linefor line in lines:name = [x.strip().lower() for x in line if x]print(name) # Check the result

虽然所有的答案都已经令人满意了,但我将尝试将这两个额外的案例与之前的所有案例一起涵盖。

如果空间不均匀,你想保持不变

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    Hereoutput = 1 W 2 R 3g

一个适用于Python 3的快速函数

Python 3.6.9 (default, Nov  7 2019, 10:44:02)[GCC 8.3.0] on linuxType "help", "copyright", "credits" or "license" for more information.>>> capitalizeFirtChar = lambda s: s[:1].upper() + s[1:]>>> print(capitalizeFirtChar('помните своих Предковъ. Сражайся за Правду и Справедливость!'))Помните своих Предковъ. Сражайся за Правду и Справедливость!>>> print(capitalizeFirtChar('хай живе вільна Україна! Хай живе Любовь поміж нас.'))Хай живе вільна Україна! Хай живе Любовь поміж нас.>>> print(capitalizeFirtChar('faith and Labour make Dreams come true.'))Faith and Labour make Dreams come true.

使用非统一空格的字符串大写

我想补充一下@Amit Gupta关于非均匀空间的观点:

从最初的问题来看,我们想将字符串s = 'the brown fox'中的每个单词大写。如果字符串是s = 'the brown fox',具有非均匀空格怎么办?

def solve(s):# If you want to maintain the spaces in the string, s = 'the brown      fox'# Use s.split(' ') instead of s.split().# s.split() returns ['the', 'brown', 'fox']# while s.split(' ') returns ['the', 'brown', '', '', '', '', '', 'fox']capitalized_word_list = [word.capitalize() for word in s.split(' ')]return ' '.join(capitalized_word_list)

你的问题的最简单的解决方案,它在我的情况下工作:

import stringdef solve(s):return string.capwords(s,' ')    
s=input()res=solve(s)print(res)

. title()方法在所有测试用例中都不起作用,因此将每个单词的第一个字母大写的最佳选择是一起使用。

例如:def caps(y):

     k=y.split()for i in k:y=y.replace(i,i.capitalize())return y

你可以试试这个,简单又整洁。

def cap_each(string):list_of_words = string.split(" ")
for word in list_of_words:list_of_words[list_of_words.index(word)] = word.capitalize()
return " ".join(list_of_words)

另一个在线解决方案可能是:

" ".join(map(lambda d: d.capitalize(), word.split(' ')))