Python标题大小写,但保留已有的大写字母

11 投票
6 回答
5868 浏览
提问于 2025-04-18 18:36

我在寻找一种非常“Python风格”的方法(Python 3.x)来完成以下操作,但还没有找到合适的办法。如果我有以下这个字符串:

string = 'this is a test string'

我可以用下面的代码把它转换成标题格式:

string.title()

这样得到的结果是:

'This Is A Test String'

但是,如果我有以下这个字符串:

string = 'Born in the USA'

应用标题格式后得到的结果是:

string = 'Born In The Usa'

应该得到:

'Born In The USA'

我想找到一种方法来进行标题格式转换,但不改变已经是大写的文本。有办法做到这一点吗?

6 个回答

2

虽然没有现成的方法,但其实模仿起来很简单:

def cap(word):
    return word[0].upper() + word[1:]

def title_preserving_caps(string):
    return " ".join(map(cap, string.split(' ')))

string = title_preserving_caps('Born in the USA')
2

这是一个简单的例子,不过只用ASCII字符。

In [3]: data = "in UK"

In [4]: titled = data.title()

In [5]: titled
Out[5]: 'In Uk'

In [8]: "".join(map(min, zip(data, titled)))
Out[8]: 'In UK'
2

看起来这就是你想要的:

def smart_title(s):
    return ' '.join(w if w.isupper() else w.capitalize() for w in s.split())

你可以像下面这个例子一样使用它:

>>> smart_title('Born in the USA')
'Born In The USA'
4

那这个怎么样:

string = 'born in the USA'

title = "".join([a if a.isupper() else b for a,b in zip(string,string.title())])
print title

显示:

Born In The USA

这个方法效率不是很高,但可以保留原字符串中的大写字母,同时也能让其他单词变成大写。

19

你想要的输出结果不太清楚。

如果你是想因为字符串里有大写字母的单词而忽略整个字符串,首先可以检查一下这个字符串是否全是小写字母:

if string.islower():
    string = string.title()

如果你只是想忽略那些已经有大写字母的特定单词,可以把字符串按空格分开,然后只把那些小写的单词变成首字母大写:

string = ' '.join([w.title() if w.islower() else w for w in string.split()])

下面是后面这种方法的示例:

>>> string = 'Born in the USA'
>>> ' '.join([w.title() if w.islower() else w for w in string.split()])
'Born In The USA'

撰写回答