860
s=“棕色狐狸”

…在这里做点什么。。。

应该是:

“棕色狐狸”

最简单的方法是什么?

24个答案24

重置为默认值
1395

这个.title()字符串方法(ASCII或Unicode都可以)的作用是:

>>>“hello world”.title()“你好,世界”>>>u“hello world”.title()u“你好,世界”

然而,如文档中所述,请注意带有内嵌撇号的字符串。

该算法使用一个简单的独立于语言的单词定义作为连续字母组。这个定义适用于许多上下文,但它意味着缩写和所有格中的撇号形成了单词边界,这可能不是理想的结果:

>>>“他们是比尔的英国朋友”.title()“他们是比尔的英国朋友”
6
  • 1
    你在示范字符串标题(),不是string.title().Python 2的unicode.title()对unicode字符串也是如此。 评论 2009年10月11日10:23
  • 90
    我用类似这样的东西来避免占有问题“”.join(w.capitalie()代表s.split()中的w) 评论 2013年4月22日19:12
  • 14
    请记住,这也会导致以下情况:In[2]:'tEst'.title()Out[2]:'tEst' 评论 2016年11月14日10:05
  • 7
    很好的答案,评论强调指出,在python中,并不是所有东西都按您需要的方式运行,但总是有方便的方法可以做到这一点。最方便的方法通常是导入一个专门构建的库,例如蟒蛇标题酶 评论 2018年3月22日5:42
  • 标题()可能会有不希望的输出,请看下面我的答案,我在这里解释了一些示例和备选方案stackoverflow.com/a/42500863/3577695
    – 圣战者
    评论 2021年3月10日10:38
279

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

>>>“他们是比尔在英国的朋友”.title()“他们是比尔的英国朋友”

尝试字符串.capwords()方法,

导入字符串capwords(“他们是比尔的英国朋友”)>>>“他们是比尔的英国朋友”

来自关于capwords的Python文档:

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

4
  • 7
    Capwords仍然不足,无法处理以下内容“曾经有一个字符串,后面有单词,然后关闭”。在这个例子中,除了那个按预期资本化。结果是“曾经有一个字符串,后面有单词,然后关闭” 评论 2016年3月25日21:53
  • 4
    不过,这比标题()正常情况下。在我的情况下,标题()返回带重音或dieresis的名称的错误输出,而大写字母()处理得当。 评论 2016年9月20日11:04
  • 6
    很好,但它仍然混淆了“英国/英国”的区别 评论 2018年11月17日15:54
  • 4
    @英国/英国的陈厚武(Chen Houwu)就是一个完美的反例。如何防止Python使用类似的方法小写现有的大写字母? 评论 2020年6月10日18:50
132

还有两种方法:

  1. 拆分成单词,在拆分组中的每个单词上草签,然后重新加入。这将改变将单词分隔成单个空白的空白,无论它是什么。

    例如,使用列表理解:

    s=“棕色狐狸”lst=[word[0].upper()+word[1:]表示s.split()中的单词s=“”.加入(lst)

    或生成器表达式(其中具有特殊语法支持):

    s=“棕色狐狸”s=“”.join(单词[0].upper()+单词[1:]代表s.split()中的单词)
  2. 使用正则表达式匹配字符串的开头,或用空格分隔单词,再加上一个非空格字符;使用括号标记“匹配组”。然后使用关于sub()替换图案,传递一个函数返回每个匹配的相应转换结果:

    进口再进口s=“棕色狐狸”定义repl_func(m):返回m.group(1)+m.groups=re.sub(“(^|\s)(\s)”,repl_func,s)

    这种方式产生了最佳效果,因为它避免了标点符号的问题,并保留了原始空白和现有的大写:

    >>>print(re.sub(“(^|\s)(\s)”,repl_func,“他们是比尔在英国的朋友”)他们是比尔的英国朋友
5
  • +1表示使用切片的溶液。我需要一种能够在不改变其他单词大小写的情况下将首字母大写的东西(例如,Foo变为Foo,但Foo变为Foo)。这是完美的。 评论 2012年5月23日15:13
  • 4
    大写返回首个大写字符,其余为小写字符
    – 瓦努安
    评论 2012年12月1日20:34
  • 1
    @瓦努,你说得对!文档字符串描述让我认为它所做的只是将第一个字母大写,但您对它的实际作用是正确的。我会编辑答案。谢谢你的提醒。 评论 2012年12月3日6:23
  • 1
    这似乎是字符串capwords根据陈厚武的回答中的文档。 评论 2019年10月11日17:58
  • 2
    在上面的答案中需要注意的是,我认为最好使用s.split(“”),而不是使用s.splic()。这是因为如果字符串有一些双空格,并且您希望在连接时保持这些双空格,则s.plit(“”)将帮助您保持这些空格,而s.split()则不会
    – 曼皮狗
    评论 2020年2月3日20:03
51

这里有一个总结了不同的方法,以及需要注意的一些陷阱。(包括何时使用.title().capwords()(大写字母)当它们可能无法工作时)

以下方法适用于所有这些输入:

""           => ""       “a b c”=>“a b c”“foO-baR”=>“foO-baR”“foo bar”=>“foo bar”“foo's bar”=>“foo's bar”“foo's1bar”=>“foo's 1bar”“foo 1bar”=>“foo 1 bar”

以下是不同的方法:

  • 将句子拆分成单词并大写第一个字母,然后再将其连接起来:

    #注意多个空格和空字符串#对于空单词w[0]将导致索引错误,#但使用w[:1],我们可以根据需要得到一个空字符串定义cap_sentence(s):对于s.split(“”)中的w,返回“”.join(w[:1].upper()+w[1:])
  • 在不拆分字符串的情况下,检查空格以查找单词的开头

    定义cap_sentence(s):对于枚举中的i和c,返回“”.join(如果i==0或s[i-1]==“”,则返回(c.upper()))
  • 或者使用生成器:

    #遍历字符串中的每个字符#并将第一个字符和空白后的任何字符大写来自itertools导入链定义cap_sentence(s):return“”.join((c.upper()if prev==“”else c)for c,prev in zip(s,chain(“”,s))
  • 使用正则表达式,来自史蒂夫的回答:

    #匹配字符串或空格的开头,后跟非空格进口再进口定义cap_sentence(s):返回re.sub(“(^|\s)(\s)”,λm:m.group(1)+m.group

现在,这些是一些其他答案如果我们将一个单词定义为句子的开头或空格后的任何内容:

  • .title()

    返回s.title()#意外输出:“foO-baR”=>“foO-baR”“foo's bar”=>“foo's bar”“foo's1bar”=>“foo's1bar”“foo 1bar”=>“foo 1bar”

  • .大写().capwords()

    return“”.join(w.capitalie()for w in s.split())#或导入字符串返回字符串.capwords#意外输出:“foO baR”=>“foO酒吧”“foo bar”=>“foo bar”

    使用' '因为分割将修复第二个输出,但不会修复第一个输出

    return“”.join(w.capitalie()for w in s.split(“”))#或导入字符串返回字符串.capwords(s,'')#意外输出:“foO baR”=>“foO酒吧”

  • .upper()

    请注意多个空格,可以使用' '用于拆分(如答案顶部所示)

    return“”.join(w[0].upper()+w[1:]表示w in s.split())#意外输出:“foo bar”=>“foo bar”
7
  • 2
    +1进行全面总结。我正在寻找一种方法,只将数字后面的单词大写(不是每个单词)。你能在你的答案中加上一个例子来证明这一点吗?例如。下部123上部应该返回下部123上部,其中上面的在数字后面大写。我知道这超出了OP的问题范围,但这是对您已经广泛回答的一个很好的补充。提前谢谢。
    – 程序员
    评论 2018年1月7日3:56
  • 1
    在这种情况下,您可以修改上面的一些方法来满足您的需求。然而,我不会把它作为答案的一部分,因为它不是大多数人想要的。我将使用regex版本,并使用“([0-9]+)(\s+.)”而不是“(^|\s)(\s)”(匹配一个或多个数字,后跟一个或更多空格,以及后面的任何字符),或“([0-9]+)(\s*.)”如果要将数字后的“零或更多”空格后的字符大写
    – 圣战者
    评论 2018年1月7日21:53
  • 1
    我一定会仔细研究一下,这让我想到了另一个特殊情况:如何修改上面的代码片段以获取字符串,例如。第一次世界大战-大战和输出第一次世界大战而不是Ww1。。。看到缩写的问题了吗?你愿意添加一些东西来演示这个案例吗?我一直在想这个问题,现在想不出一个办法。
    – 程序员
    评论 2018年1月8日22:38
  • 1
    上述第一种方法不会更改输入字符串中已经大写的字母,因此第一次世界大战将输出为世界大战1
    – 圣战者
    评论 2018年1月10日0:45
  • 2
    非常感谢,我一直在寻找能以这种方式解决这个问题的东西,真的很好的答案,所有解释得很好的“参数fooR”都返回为“参数fooR”,现在我终于可以停止破坏我的小指来对抗来自未来的shift键欢呼
    – 鲍里斯
    评论 2021年7月26日3:04
17

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

只要这样做:

string=“棕色狐狸”string[0].upper()+string[1:]
7
  • 4
    因为可以有几个单词。
    – 阿尔诺
    评论 2015年11月18日13:20
  • 2
    是的,但我通常只想大写第一个字母。这是一种方法。 评论 2016年11月11日12:31
  • 2
    那你就不用“棕色狐狸”.capitalie()? 评论 2016年12月10日12:09
  • 4
    @幸运的是因为也许我不想转身“这是约翰”进入之内“这是约翰”.
    – 1月37日
    评论 2017年4月11日11:30
  • 这么简单不是更好的方法吗字符串.大写()(基本上是在呼应@luckydonald) 评论 2018年7月19日13:12
17

@jibberia anwser的复写版本:

定义大写(行):对于第.split(“”)行中的s,返回“”.join(s[:1].upper()+s[1:])
6
  • 2
    无需建立列表。str.join(字符串连接)接受生成器。 评论 2015年1月27日8:04
  • @warvariuc您将如何更改此代码以利用生成器? 评论 2015年1月27日23:40
  • 1
    只需像往常一样去掉方括号在这里 评论 2015年1月28日6:34
  • 1
    尽管@warvariuc很好地提到了这一点参加接受gen-exps,如果str.join(字符串连接)特别地,通常优选使用列表理解。这是因为参加在参数上迭代两次,因此提供就绪列表比提供生成器更快。 评论 2016年8月26日14:28
  • 1
    @BhargavRao为什么str.join(字符串连接)需要在参数上迭代两次吗?我只是检查了一下——没有。虽然对于小序列来说,列表理解确实更快。 评论 2016年8月27日7:19
12

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

>>>“hello world”.大写()“你好,世界”

但要大写每个单词:

>>>“hello world”.title()“你好,世界”
1
  • 4
    小心,因为“你好,纽约”。大写()“你好,纽约” 评论 2020年2月15日21:52
11

如果str.title()不适合您,请自己进行大写。

  1. 将字符串拆分为单词列表
  2. 每个单词的第一个字母大写
  3. 将单词连接成一个字符串

单线:

>>>''.join([s[0].upper()+s[1:]代表“他们是比尔的英国朋友”中的s。split('')])“他们是比尔在英国的朋友”

清晰的示例:

input=“他们是比尔的英国朋友”words=输入.split(“”)大写单词=[]对于单词中的单词:title_case_word=单词[0].upper()+单词[1:]大写单词.append(title_case_word)output=“”.join(大写单词)
2
  • 1
    这个解决方案的一个有趣之处是,您会丢失任何特殊的空白。根据上下文,可能并不重要。 评论 2011年10月17日19:25
  • 值得指出的是,如果要大写的句子或单词集包含像“a”或“I”这样的单字符单词,那么这将失败
    – 内森
    评论 2020年11月2日17:51
9

如果访问[1:],空字符串将引发错误。因此,我将使用:

定义my_uppercase(标题):如果不是标题:返回“”返回标题[0].upper()+标题[1:]

只将第一个字母大写。

  • 1
    这不是吗住院治疗是为了什么? 评论 2017年11月7日17:20
  • 4
    @尤金,是的,但不幸的是,所有其他可能不可取的字母都要大写小写/ 评论 2017年12月12日8:46
  • 1
    return title[:1].upper()+title[1:]也可以解决这个问题,因为这样分割空字符串将得到2个空字符串,连接在一起形成一个空字符串并返回
    – 圣战者
    评论 2018年1月7日21:42
8

如果您将使用方法.title(),那么'后面的字母也将变为大写。这样地:

>>>“hello world’s”.title()“你好世界”

为了避免这种情况,请使用字符串库中的capwords函数。这样地:

>>>导入字符串>>>字符串.capwords(“helloworld's”)“你好,世界”
7

虽然所有的答案都已经令人满意了,但我会尽量把额外的两个案例和之前的所有案例一起涵盖在内。

如果空间不一致,您希望保持一致

string=你好,我在这里。

如果所有字符串都不是从字母开始的

字符串=1 w 2 r 3g

您可以在这里使用:

定义解算:a=s.split(“”)对于范围内的i(len(a)):a[i]=a[i].大写()return“”.join(a)

这将为您提供:

output=你好世界我在这里输出=1 W 2 R 3g
2
  • 2
    感谢您强调非均匀空间的情况。上面的一些答案使用s.split()而不是s.splic(“”)。值得注意的是,对于非均匀空间,使用s.split(“”)将确保保持非均匀空间!再次感谢
    – 曼皮狗
    评论 2020年2月3日20:06
  • 这对于空格不均匀的单词或以数字开头的单词非常适用。谢谢:) 评论 2020年4月21日20:24
6

正如马克指出的,你应该使用.title():

“MyAwesomeString”.title()

但是,如果要将第一个字母改为大写在Django模板中,您可以使用此选项:

{{“MyAwesomeString”|标题}}

或使用变量:

{{myvar|title}}
4

建议的方法str.title()并不适用于所有情况。例如:

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

而不是“A B 3c”.

我认为,最好这样做:

定义大写单词(字符串):words=string.split(“”)#只需更改split(“”return“”.join([word.capitalie()代表单词])大写_单词(字符串)>“A B 3c”
2
  • 1
    然而,如果分隔它们的空格数不是1,则可能会出现错误。供参考:黑客链路问题 评论 2018年9月17日5:37
  • 我试过了string=“a b 3c”结果是“A B 3c” 评论 2023年3月2日19:46
2

要大写单词。。。

str=“这是字符串示例……哇!!!”;打印“str.title():”,str.titre();

@Gary02127注释,以下解决方案使用带撇号的标题

进口再进口定义标题:return re.sub(r“[A-Za-z]+('[A-Za-z]+)?”,lambda mo:mo.group(0)[0].upper()+mo.group(0)[1:].lower(),s)text=“他是工程师,不是吗?SnippetBucket.com”打印(标题栏(文本))
  • 使用现有函数可以在python中快速执行。 评论 2016年7月26日13:17
  • 我不太喜欢title(),因为它不处理撇号。“我不会说”.title()给出“我不会说话” 评论 2017年12月22日16:17
  • @Gary02127我已经更新了答案,请看一下,你的问题域也很好 评论 2017年12月30日10:48
2

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

例如:def caps(y):

k=y.拆分()对于k中的i:y=y.replace(i,i.大写())返回y
2

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

定义cap_each(字符串):list_of_words=string.split(“”)对于单词列表中的单词:list_of_words[list_of-words.index(word)]=单词大写()return“”.join(单词列表)
1

你可以使用标题()在Python中,将字符串中的每个单词大写的方法:

string=“这是一个测试字符串”capitalized_string=字符串.title()打印(大写字符串)

输出:

这是一个测试字符串
0

不要忽视保留空白。如果你想处理“弗雷德·弗林斯通”你会得到“弗雷德·弗林斯通”而不是“弗雷德·弗林斯通”,您损坏了您的空白区。上述一些解决方案将失去空白。这是一个适合Python 2和3的解决方案,并保留了空白。

定义属性:return“”.join(map(“”.大写,re.拆分(r'(\s+)',s))
0

你的问题最简单的解决方案,在我的案例中奏效了:

导入字符串定义解算:返回字符串.capwords(s,'')s=输入()res=求解打印(res)
-1

一个快速函数适用于Python 3

Python 3.6.9(默认为2019年11月7日10:44:02)[GCC 8.3.0]在linux上键入“help”、“copyright”、“credits”或“license”以获取更多信息。>>>大写FirtChar=lambda s:s[:1].upper()+s[1:]>>>印刷体(大写首字母(“ПомнитесвоихПреДковъ.СратааиансарвДуиСПиркавеаетиВост!”)Помните своих Предковъ. Сражайся за Правду и Справедливость!>>>打印(大写首字母(“хаарираиатетиталнаУкркаоа!еаеиеЛбовПомас.”)Хай живе вільна Україна! Хай живе Любовь поміж нас.>>>print(大写FirtChar('信仰和工党使梦想成真')信仰和劳动使梦想成真。
1
  • 这个答案只将句子的第一个字母大写。要求将第一个字母大写的问题每个单词在一个句子里
    – 圣战者
    评论 2022年3月11日21:57
-1

用非均匀空格大写字符串

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

从最初的问题来看,我们希望字符串中的每个单词都大写s=“棕色狐狸”。如果字符串是s=“棕色狐狸”具有非均匀空间。

定义解算:#如果要保留字符串中的空格,s='thebrownfox'#使用s.split(“”)而不是s.splic()。#s.split()返回['the','brown','fox']#而s.split('')返回['the','brown','','',''',''capitalied_word_list=[word.capitalie()代表s.split(“”)中的单词]return“”.join(大写单词列表)
1
  • ..如果在brown和fox之间没有空格,则代码无法补偿制表符;-) 评论 2020年3月26日9:21
-1

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

“”.join(map(lambda d:d.capitalie(),word.split(''))
5
  • 21个现有答案对这个问题,包括一个得票最多的人,接受了超过的回答1200票.你是吗某些你的解决方案还没有给出?如果没有,为什么您认为您的方法改进了社区已验证的现有建议?提供解释是总是在堆栈溢出上很有用,但它尤其地重要的是,问题的解决令OP和社区都满意。通过解释你的答案有什么不同以及什么时候可能更喜欢它来帮助读者。 评论 2022年2月15日1:22
  • 抱歉@JeremyCaney,但我在另一条评论中没有看到这个解决方案。尽管如此,我认为这个网站有两个选项:投票或取消投票。如果你觉得我的解决方案没有用处,请取消投票。但是,我再次认为这个平台是用于共享解决方案的,在这种情况下,这是一个简单问题的简单解决方案。我不知道如果有其他几个好的解决方案,可能不会出现另一个。 评论 2022年2月17日12:24
  • @JeremyCaney我发现一些类似的答案:链接.恭喜!在这种情况下,他使用的是regexp,而我使用的是空格字符 评论 2022年2月17日12:27
  • 我不知道为什么我有幸接受你的演讲。因为,这是一个需要简单解决方案的简单问题。我不知道为什么我没有收到别人的建议。但还是要谢谢你 评论 2022年2月18日12:20
  • 1
    我是在“低质量答案”审查队列中看到你的帖子的,这是一个帖子所在的队列,这些帖子要么被标记为没有答案,要么偏离了某些自动启发(例如,基于长度、缺乏解释等)。你的答案似乎是有效的,我确实投票保留了它。但我也想确保你对如何改进它有反馈。作为Stack Overflow的消费者,发现有很多只包含代码的答案的问题可能会让人不知所措,所以解释为什么?一种方法不同于-如果不比其他答案更可取的话,那么它是非常有用的。 评论 2022年3月7日19:53
-2

万一你想裁员

#假设您正在打开一个新文件打开(input_file)作为文件:行=[x代表读取器(文件)中的x,如果x]#for循环按行解析文件对于直线中的直线:name=[x.strip().lower()for x in line if x]print(name)#检查结果
-3

我真的很喜欢这个答案:

@jibberia anwser的复写版本:

定义大写(行):return“”.join([s[0].upper()+s[1:]表示第.split(“”)行中的s)

但我发送的一些行中分离出了一些空白的“”字符,这些字符在尝试执行s[1:]时会导致错误。可能有更好的方法可以做到这一点,但我必须添加一个if len(s)>0,如

return“”.join([s[0].upper()+s[1:]代表第行中的s。如果长度>0],则为split(“”)
0

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.