CamelCase每个字符串,任何标准库?

day*_*mer 73 python

例:

HILO -> Hilo
new york -> New York
SAN FRANCISCO -> San Francisco
Run Code Online (Sandbox Code Playgroud)

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

Fac*_*sco 167

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

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

如果你真的想要CamelCase,你可以使用它:

>>> ''.join(x for x in 'make IT pascal CaSe'.title() if not x.isspace())
'MakeItPascalCase'
Run Code Online (Sandbox Code Playgroud)

  • 如果有人觉得他们是疯狂的药 - 这是PascalCase,而不是camelCase. (14认同)
  • 为了记录,一个更简洁的方法来做最后一个CamelCase示例就是'make IT camel CaSe'.title().replace('','')`. (13认同)
  • 我认为"他们"中的'r'应该是小写的."比尔"中的"s"肯定是小写的. (5认同)
  • 好的代码,但camelCase不是以CAPITAL开头.试试这个:`def toCamel(s):ret =''.join(如果不是x.isspace()则x在s.title()中为x)返回ret [0] .lower()+ ret [1:]`用法:`toCamel("在camelcase中写这个")'writeThisInCamelcase'` (4认同)
  • @Daniel - 这个问题在`title`的文档中注明:"该算法使用一个简单的语言无关的单词定义作为连续字母组.该定义在许多情况下起作用,但它意味着收缩和占有形式的撇号字边界,这可能不是理想的结果".一种可能的解决方案是使用劳伦斯的回答用正则表达式"r"['\ w] +"`所以撇号不会结束匹配(可以根据需要添加额外的标点符号). (2认同)

Iva*_*aer 19

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

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


Lau*_*ves 9

def capitalizeWords(s):
  return re.sub(r'\w+', lambda m:m.group(0).capitalize(), s)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

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


小智 7

只需使用 .title() ,它就会将每个单词的第一个字母转换为大写,其余为小写:

>>> a='mohs shahid ss'
>>> a.title()
'Mohs Shahid Ss'
>>> a='TRUE'
>>> b=a.title()
>>> b
'True'
>>> eval(b)
True
Run Code Online (Sandbox Code Playgroud)


mul*_*ces 6

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

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


小智 6

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

例子:

import stringcase
stringcase.camelcase('foo_bar_baz') # => "fooBarBaz"
Run Code Online (Sandbox Code Playgroud)

尽管它是否会留下空格是值得怀疑的。(示例显示它删除了空格,但有一个错误跟踪器问题指出它会留下空格。)


Mar*_*arc 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))
Run Code Online (Sandbox Code Playgroud)

,当被调用时,将导致这种方式

camel("San Francisco")  # sanFrancisco
camel("SAN-FRANCISCO")  # sanFrancisco
camel("san_francisco")  # sanFrancisco
Run Code Online (Sandbox Code Playgroud)

不那么简单

请注意,当呈现已经使用驼峰式字符串时它会失败!

camel("sanFrancisco")   # sanfrancisco  <-- noted limitation
Run Code Online (Sandbox Code Playgroud)

更不简单

请注意,它会因许多 unicode 字符串而失败

camel("México City")    # mXicoCity     <-- can't handle unicode
Run Code Online (Sandbox Code Playgroud)

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