如何在Python中将字符串转换为Title Case?


94

例:

HILO -> Hilo
new york -> New York
SAN FRANCISCO -> San Francisco

是否有执行此任务的库或标准方法?


16
那不是“ CamelCase”,那是“ Capitalize”;你要哪个?
安德鲁·马歇尔

13
camelCase就是这样。
乔纳森·M

5
您的示例使用PascalCase。
David Betz

Answers:


213

为什么不使用title文档中的Right:

>>> "they're bill's friends from the UK".title()
"They'Re Bill'S Friends From The Uk"

如果您真的想要PascalCase,可以使用以下命令:

>>> ''.join(x for x in 'make IT pascal CaSe'.title() if not x.isspace())
'MakeItPascalCase'

5
我认为“他们是”中的“ r”应小写。而且“帐单”中的“ s”绝对必须为小写。
丹尼尔·菲舍尔

3
@Daniel-该问题在docs中被记录为title:“该算法使用一个简单的语言无关的单词定义为连续字母组。该定义在许多情况下都有效,但这意味着收缩和所有格中的撇号形成单词边界,这可能不是理想的结果”。一种可能的解决方案是将Laurence的答案与正则表达式一起使用,以r"['\w]+"使撇号不会结束匹配(可以根据需要添加其他标点符号)。
Andrew Clark

18
作为记录,最后一个CamelCase示例的更整洁的方式是'make IT camel CaSe'.title().replace(' ', '')
亨利·戈默索尔

15
如果有人觉得自己正在服用疯狂药丸-这是PascalCase,而不是camelCase。
罗布

4
好的代码,但是camelCase不是以CAPITAL开头。试试这个: def toCamel(s): ret = ''.join(x for x in s.title() if not x.isspace()) return ret[0].lower() + ret[1:] 用法:toCamel("WRITE this in camelcase") 'writeThisInCamelcase'
Ron Kalian

21

这个总是以小写字母开头,并且还会去除非字母数字字符:

def camelCase(st):
    output = ''.join(x for x in st.title() if x.isalnum())
    return output[0].lower() + output[1:]

8
def capitalizeWords(s):
  return re.sub(r'\w+', lambda m:m.group(0).capitalize(), s)

re.sub可以为“替换”使用一个函数(而不是字符串,这是大多数人似乎熟悉的用法)。re.Match对于模式的每个匹配项,将使用一个对象调用此repl函数,结果(应为字符串)将用作该匹配项的替换。

同一件事的更长版本:

WORD_RE = re.compile(r'\w+')

def capitalizeMatch(m):
  return m.group(0).capitalize()

def capitalizeWords(s):
  return WORD_RE.sub(capitalizeMatch, s)

这将预编译模式(通常认为是好的形式),并使用命名函数而不是lambda。


这个很整洁,我想让我了解lambda函数,谢谢您的帮助
做白日梦的人

1
我刚刚问@JohnMachin,因为我认为添加一些解释将使您的答案更完整,更好。
NN

@Laurence Gonsalves lambda在这里做什么?
锡安

Lambda在这里做什么?我可以从中解密,也可以从您那里得到解释。这是我的理解。当您在re.sub中使用一个函数时,每个函数都match将传递给该函数?并且由于matches在正则表达式中有分组。多数民众赞成为什么这条线存在lambda m:m.group(0).capitalize()
锡安

@Zion是的。当re.sub给定一个可调用的(例如:一个函数)作为“替换”时,它将匹配对象传递给该可调用的对象,并期望取回一个实际用作替代的字符串。如果您发现lambda令人困惑,则“较长版本”将以更冗长的方式执行完全相同的操作。
劳伦斯·贡萨尔维斯

5

为什么不写一个?这样的事情可能会满足您的要求:

def FixCase(st):
    return ' '.join(''.join([w[0].upper(), w[1:].lower()]) for w in st.split())

谢谢,这完全有帮助。不好意思,我没想到要写第一本书
做白日梦的人

5

注意:为什么我还要提供另一个答案? 此答案基于问题的标题和驼峰字母的定义,概念是:一系列已连接在一起的单词(没有空格!),这样每个原始单词都以大写字母开头(其余均为小写)除了系列的第一个单词(完全小写)。还假定“所有字符串”是指ASCII字符集。unicode不适用于此解决方案)。

简单

鉴于以上定义,此功能

import re
word_regex_pattern = re.compile("[^A-Za-z]+")

def camel(chars):
  words = word_regex_pattern.split(chars)
  return "".join(w.lower() if i is 0 else w.title() for i, w in enumerate(words))

,当被调用时,将以这种方式产生

camel("San Francisco")  # sanFrancisco
camel("SAN-FRANCISCO")  # sanFrancisco
camel("san_francisco")  # sanFrancisco

不太简单

请注意,如果出现已经用驼峰大小写的字符串,它将失败!

camel("sanFrancisco")   # sanfrancisco  <-- noted limitation

更简单

请注意,它失败并带有许多unicode字符串

camel("México City")    # mXicoCity     <-- can't handle unicode

对于这些案例,我没有解决方案(或者其他可以引入一些创造力的案例)。因此,就像在所有与字符串有关的事情中一样,用Unicode覆盖自己的边缘情况并祝您好运!


在不知道句子含义的情况下,如何确定字符串是Camel大小写?在您的“不太简单”的示例中,“ sanfRancisco”是Camel大小写,也是“ itSnotcaMelcAse”。
帕特里斯·贝纳索拉

我猜您的输入中有撇号或其他标点符号?我应该注意其他失败的输入。绝对不错。您提供了什么输入?
马克

1
我的意思是,必须将一个不带空格的字符序列视为一个单词。在不知道句子含义的情况下,您无法从中提取作品。将“ sanfRancisco”或“ itSnotcaMelcAse”作为camello()的输入,您将看到输出将相同。
Patrice Bernassola'7

哦,我明白了-是的,我认为您是对的。我过分解决了。我会更新。
马克

4

潜在库:https : //pypi.org/project/stringcase/

例:

import stringcase
stringcase.camelcase('foo_bar_baz') # => "fooBarBaz"

尽管是否会留有空间还是个问题。(示例显示它会留出空间,但是存在一个错误跟踪器问题,指出它会留有空间。)


哎呀。正在寻找包裹。该软件包还具有蛇形包和其他转换功能。
s2t2

1

只需使用.title(),它将转换成大写的每个单词的首字母,小写:

>>> a='mohs shahid ss'
>>> a.title()
'Mohs Shahid Ss'
>>> a='TRUE'
>>> b=a.title()
>>> b
'True'
>>> eval(b)
True

1

我想对此发表一点贡献:

def to_camelcase(str):
  return ' '.join([t.title() for t in str.split()])

实际上,str.title()是相同的,您可以节省计算成本。
Auros132

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.