Exemplo:
HILO -> Hilo
new york -> New York
SAN FRANCISCO -> San Francisco
Existe uma biblioteca ou maneira padrão de realizar esta tarefa?
Exemplo:
HILO -> Hilo
new york -> New York
SAN FRANCISCO -> San Francisco
Existe uma biblioteca ou maneira padrão de realizar esta tarefa?
Respostas:
Por que não usar o titleRight from the docs:
>>> "they're bill's friends from the UK".title()
"They'Re Bill'S Friends From The Uk"
Se você realmente queria PascalCase, você pode usar isto:
>>> ''.join(x for x in 'make IT pascal CaSe'.title() if not x.isspace())
'MakeItPascalCase'
title: "O algoritmo usa uma definição simples independente de linguagem de uma palavra como grupos de letras consecutivas. A definição funciona em muitos contextos, mas significa que apóstrofos em contrações e possessivos formam os limites das palavras, que pode não ser o resultado desejado ". Uma solução possível seria usar a resposta de Laurence com o regex r"['\w]+"para que os apóstrofos não encerrassem uma correspondência (pontuação adicional poderia ser adicionada conforme necessário).
'make IT camel CaSe'.title().replace(' ', '').
def toCamel(s): ret = ''.join(x for x in s.title() if not x.isspace()) return ret[0].lower() + ret[1:] Uso:toCamel("WRITE this in camelcase") 'writeThisInCamelcase'
Este sempre começaria com letras minúsculas e também removeria os caracteres não alfanuméricos:
def camelCase(st):
output = ''.join(x for x in st.title() if x.isalnum())
return output[0].lower() + output[1:]
def capitalizeWords(s):
return re.sub(r'\w+', lambda m:m.group(0).capitalize(), s)
re.subpode ter uma função para a "substituição" (em vez de apenas uma string, que é o uso com o qual a maioria das pessoas parece estar familiarizada). Esta função repl será chamada com um re.Matchobjeto para cada correspondência do padrão, e o resultado (que deve ser uma string) será usado como um substituto para aquela correspondência.
Uma versão mais longa da mesma coisa:
WORD_RE = re.compile(r'\w+')
def capitalizeMatch(m):
return m.group(0).capitalize()
def capitalizeWords(s):
return WORD_RE.sub(capitalizeMatch, s)
Isso pré-compila o padrão (geralmente considerado uma boa forma) e usa uma função nomeada em vez de um lambda.
matchserá passado para a função? e desde que matchesem expressões regulares tem grupos. é por isso que esta linha existe lambda m:m.group(0).capitalize()?
re.subrecebe um chamável (por exemplo: uma função) como a "substituição", ele passa o objeto de correspondência para aquele chamável e espera receber de volta uma string que é o que ele realmente usa como substituição. Se você achar lambdas confusos, a "versão mais longa" faz exatamente a mesma coisa de uma forma mais detalhada.
Por que não escrever um? Algo assim pode satisfazer seus requisitos:
def FixCase(st):
return ' '.join(''.join([w[0].upper(), w[1:].lower()]) for w in st.split())
Observação: por que estou fornecendo mais uma resposta? Essa resposta é baseada no título da pergunta e na noção de que caixa-de-camelo é definida como: uma série de palavras que foram concatenadas (sem espaços!) De forma que cada uma das palavras originais comece com uma letra maiúscula (o resto sendo minúsculo) exceto a primeira palavra da série (que é totalmente minúscula). Além disso, presume-se que "todas as strings" se refere ao conjunto de caracteres ASCII; Unicode não funcionaria com esta solução).
Dada a definição acima, esta função
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))
, quando chamado, resultaria desta maneira
camel("San Francisco") # sanFrancisco
camel("SAN-FRANCISCO") # sanFrancisco
camel("san_francisco") # sanFrancisco
Observe que ele falha quando apresentado com uma corda já revestida de camelo!
camel("sanFrancisco") # sanfrancisco <-- noted limitation
Observe que ele falha com muitas strings Unicode
camel("México City") # mXicoCity <-- can't handle unicode
Não tenho solução para esses casos (ou outros que poderiam ser apresentados com alguma criatividade). Então, como em todas as coisas que têm a ver com cordas, cubra seus próprios casos extremos e boa sorte com Unicode!
Biblioteca potencial: https://pypi.org/project/stringcase/
Exemplo:
import stringcase
stringcase.camelcase('foo_bar_baz') # => "fooBarBaz"
Embora seja questionável se deixará espaços. (Os exemplos mostram que ele remove espaço, mas há um problema de rastreador de bug observando que ele os deixa.)
apenas use .title (), e ele converterá a primeira letra de cada palavra em maiúsculo, o restante em minúsculo:
>>> a='mohs shahid ss'
>>> a.title()
'Mohs Shahid Ss'
>>> a='TRUE'
>>> b=a.title()
>>> b
'True'
>>> eval(b)
True
def camelCase(st):
s = st.title()
d = "".join(s.split())
d = d.replace(d[0],d[0].lower())
return d