Python Title Case,但保留预先存在的大写

时间:2014-08-26 17:48:35

标签: python regex python-3.x

我正在寻找一种非常pythonic的方式(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 个答案:

答案 0 :(得分:8)

目前尚不清楚您期望的输出结果。

如果您想忽略整个字符串,因为它包含大写字词,请首先测试该字符串是否为小写:

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'

答案 1 :(得分:2)

怎么样:

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

效率不高,但会保留原始字符串中的大写字母,但允许大写其他字词。

答案 2 :(得分: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')

答案 3 :(得分: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 :(得分:1)

这是一个快速的,仅限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'

答案 5 :(得分:0)

这可能已经为OP解决,但我想提供一个版本,该版本还可以处理其他分隔符,而不仅仅是空格。

import re
def title_keep_upper(text):
    return text if text.upper() == text else text.title()

def to_title_case(text):
    grps = re.split('(\W)', text)
    return ''.join([title_keep_upper(x) if i % 2 == 0 else x for i, x in enumerate(grps)])

我们首先将文本拆分为非字母数字字符(可以更改正则表达式以处理不同的文本)。此后,我们知道其他所有组都是分隔符或单词。然后,我们将每个单词与上述帖子中提到的内容类似。 这样,诸如HR-consultant之类的标题也将正确地大小写为HR-Consultant