我正在寻找一种非常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'
我正在寻找一种方法来做一个标题案例,但不会调整现有的大写文本。有没有办法做到这一点?
答案 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
。