在标点和空格处将字符串的每个令牌的首字母大写

时间:2019-06-02 01:27:36

标签: python capitalization

我正试图为以下字符串加上标题:

"Men's L/s button-up"

我现在正在使用string.capwords,但无法正常工作。

例如:

x = "Men's L/s button-up"
y = string.capwords(x)
print(y)

输出:

Men's L/s Button-up

但我想要

Men's L/S Button-Up(/后面的大写S和-后面的大写U)

更一般而言,如何确保空格或标点后面的所有字母都大写?

这是来自

的后续活动

Keep uppercase after / in a string

2 个答案:

答案 0 :(得分:3)

我要解决的方法是将每个要大写的单词(使用re.split进行拆分,将要单词大写(使用str.capitalize),然后重新组合单词以获得单个字符串(使用str.join):

>>> from re import split
>>> 
>>> string = "Men's L/s button-up"
>>> ''.join([word.capitalize() for word in split("([ /-])", string)])
"Men's L/S Button-Up"
>>

如果需要分割更多的标点符号,只需将它们添加到正则表达式中即可。例如,如果您确定需要在撇号后大写单词/字符,请添加:

"([ '/-])"

可以使用正则表达式:

>>> ''.join([word.capitalize() for word in split("([ '/-])", string)])
"Men'S L/S Button-Up"
>>>

答案 1 :(得分:3)

string.capwords对此不起作用,因为在内部,它使用str.split()生成令牌(docs)。 str.split()仅可在空白运行(默认行为)或使用用户指定的字符/字符串(docs)时拆分。如果指定了字符串,则将其视为一个整体,而不是单独的字符。

要实现所需的功能,我将使用正则表达式,例如:

import re

x = "Men's L/s button-up"
y = re.sub(r'[\w]+', lambda m: m.group(0).capitalize(), x)
print(y)
# "Men'S L/S Button-Up"

re.subdocs)可用于替换给定字符串内的子字符串。第二个参数是一个函数,该函数接受一个match object参数并返回替换字符串(在这种情况下,我们将全部匹配大写)。

如果您偶然发现了这个问题,还请确保查看下面的@Christian答案,因为它提供了一种拆分字符串的好方法:)