Exemplo:
>>> convert('CamelCase')
'camel_case'
python
camelcasing
Sridhar Ratnakumar
fonte
fonte
NotCamelCase
, masthisIs
Respostas:
Caso camelo para cobra
Se você fizer isso muitas vezes e o acima for lento, compile o regex antecipadamente:
Para lidar com casos mais avançados especialmente (isso não é mais reversível):
Caso cobra para camelo
fonte
not_camel_case
paranotCamelCase
e / ouNotCamelCase
?s2.replace('__', '_')
Há uma biblioteca de inflexão no índice do pacote que pode lidar com essas coisas para você. Nesse caso, você procuraria
inflection.underscore()
:fonte
Não sei por que tudo isso é tão complicado.
na maioria dos casos, a expressão simples
([A-Z]+)
fará o truquePara ignorar o primeiro caractere, basta adicionar look behind
(?!^)
Se você deseja separar ALLCaps em all_caps e esperar números em sua string, ainda não precisa executar duas execuções separadas, basta usar
|
Esta expressão((?<=[a-z0-9])[A-Z]|(?!^)[A-Z](?=[a-z]))
pode lidar com praticamente todos os cenários do livroTudo depende do que você deseja, então use a solução que melhor se adapte às suas necessidades, pois ela não deve ser muito complicada.
nJoy!
fonte
(?!^)
expressão sendo chamada de olhar para trás. A menos que eu esteja perdendo alguma coisa, o que realmente queremos aqui é um olhar negativo por trás, que deve ser expresso como(?<!^)
. Por razões que não posso compreender o seu negativo olhar em frente(?!^)
parece funcionar, também ..."Camel2WARNING_Case_CASE"
torna - se"camel2_warning_case__case"
. Você pode adicionar um(?<!_)
lookbehind negativo, para resolvê-lo:re.sub('((?<=[a-z0-9])[A-Z]|(?!^)(?<!_)[A-Z](?=[a-z]))', r'_\1', "Camel2WARNING_Case_CASE").lower()
retornos'camel2_warning_case_case'
(?!^)
foi chamado incorretamente de "olhar para trás" e deveria ter sido chamado de afirmação negativa à vista . Como essa boa explicação mostra, os lookaheads negativos geralmente vêm após a expressão que você está procurando. Então você pode pensar(?!^)
em "encontrar o''
que<start of string>
não segue". De fato, um olhar negativo por trás também funciona: você pode pensar(?<!^)
em "encontrar''
onde<start of string>
não precede".stringcase é minha biblioteca preferida para isso; por exemplo:
fonte
Pessoalmente, não tenho certeza de como algo usando expressões regulares em python pode ser descrito como elegante. A maioria das respostas aqui estão apenas fazendo truques do tipo "código golfe" RE. A codificação elegante deve ser facilmente entendida.
fonte
+=
nas cordas é quase sempre uma má ideia. Anexar a uma lista e''.join()
no final. Ou, neste caso, simplesmente juntá-lo com um sublinhado ...Prefiro evitar,
re
se possível:fonte
re
biblioteca e fazer as coisas apenas em uma linha usando apenas str.methods embutidos! É semelhante a essa resposta , mas evita o uso de fatias e adicionaisif ... else
simplesmente removendo "_" potencialmente adicionado como primeiro caractere. Eu gosto mais disso.6.81 µs ± 22.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
mas para essa resposta2.51 µs ± 25.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
que é 2,5 vezes mais rápida! Amo isso!fonte
Eu acho que essa solução é mais direta que as respostas anteriores:
Quais saídas:
A expressão regular corresponde a três padrões:
[A-Z]?[a-z]+
: Letras minúsculas consecutivas que, opcionalmente, começam com uma letra maiúscula.[A-Z]{2,}(?=[A-Z][a-z]|\d|\W|$)
: Duas ou mais letras maiúsculas consecutivas. Ele usa um lookahead para excluir a última letra maiúscula, se for seguida por uma letra minúscula.\d+
: Números consecutivos.Ao usar
re.findall
, obtemos uma lista de "palavras" individuais que podem ser convertidas em minúsculas e associadas a sublinhados.fonte
Não sei por que usar as duas chamadas .sub ()? :) Eu não sou um guru de regex, mas simplifiquei a função para este, que é adequada para minhas necessidades, só precisava de uma solução para converter camelCasedVars da solicitação POST em vars_with_underscore:
Ele não funciona com nomes como getHTTPResponse, porque ouvi dizer que é uma má convenção de nomenclatura (deve ser como getHttpResponse, é óbvio que é muito mais fácil memorizar este formulário).
fonte
'HTTPConnectionFactory'
, seu código produz'h_tt_pconnection_factory'
, código de resposta aceita produz'http_connection_factory'
Aqui está a minha solução:
Ele suporta os casos de canto discutidos nos comentários. Por exemplo, ele será convertido
getHTTPResponseCode
para oget_http_response_code
que deveria.fonte
Para se divertir:
Ou, mais pela diversão:
fonte
str.join
foi descontinuado por idades . Use em''.join(..)
vez disso.O uso de expressões regulares pode ser o mais curto, mas esta solução é muito mais legível:
fonte
Tantos métodos complicados ... Basta encontrar todo o grupo "Titled" e associar sua variante mais baixa com sublinhado.
Se você não deseja criar números como o primeiro caractere do grupo ou o grupo separado - pode usar a
([A-z][a-z0-9]*)
máscara.fonte
Não está na biblioteca padrão, mas encontrei este script que parece conter a funcionalidade necessária.
fonte
Este não é um método elegante, é uma implementação de 'nível muito baixo' de uma máquina de estado simples (máquina de estado de campo de bits), possivelmente o modo mais anti-pitonico para resolver isso, no entanto, o módulo reimplementar também implementa uma máquina de estado muito complexa para resolver essa questão simples. tarefa, então eu acho que esta é uma boa solução.
splitsymbol pode analisar todos os tipos de caso: UpperSEQUENCEInterleaved, under_score, BIG_SYMBOLS e cammelCasedMethods
Espero que seja útil
fonte
Levemente adaptado de https://stackoverflow.com/users/267781/matth que usa geradores.
fonte
Dê uma olhada na excelente biblioteca de Esquemas
https://github.com/schematics/schematics
Ele permite que você crie estruturas de dados digitados que podem serializar / desserializar do tipo python para Javascript, por exemplo:
fonte
Este método simples deve fazer o trabalho:
(extraído daqui , veja o exemplo de trabalho online )
fonte
Uau, acabei de roubar isso de trechos de django. ref http://djangosnippets.org/snippets/585/
Bastante elegante
Exemplo:
Devoluções:
REGEX DEMO
fonte
Um exemplo horrendo usando expressões regulares (você pode facilmente limpar isso :)):
Funciona para getHTTPResponseCode!
Como alternativa, usando lambda:
EDIT: Também deve ser bastante fácil ver que há espaço para melhorias em casos como "Teste", porque o sublinhado é inserido incondicionalmente.
fonte
Aqui está algo que eu fiz para alterar os cabeçalhos em um arquivo delimitado por tabulações. Estou omitindo a parte em que apenas editei a primeira linha do arquivo. Você pode adaptá-lo facilmente ao Python com a re library. Isso também inclui separar números (mas mantém os dígitos juntos). Fiz isso em duas etapas, porque era mais fácil do que dizer para não colocar um sublinhado no início de uma linha ou tabulação.
Etapa 1 ... encontre letras maiúsculas ou números inteiros precedidos por letras minúsculas e preceda-os com um sublinhado:
Procurar:
Substituição:
Etapa 2 ... execute o procedimento acima e execute-o novamente para converter todos os limites em minúsculas:
Procurar:
Substituição (barra invertida, L minúsculo, barra invertida, uma):
fonte
Eu estava procurando uma solução para o mesmo problema, exceto que precisava de uma corrente; por exemplo
Começando pelas boas soluções de duas palavras aqui, criei o seguinte:
A maior parte da lógica complicada é evitar minúsculas na primeira palavra. Aqui está uma versão mais simples, se você não se importa de alterar a primeira palavra:
Obviamente, você pode pré-compilar as expressões regulares ou juntar-se ao sublinhado em vez do hífen, conforme discutido nas outras soluções.
fonte
Conciso sem expressões regulares, mas HTTPResponseCode => activationpresponse_code:
fonte
Sem nenhuma biblioteca:
Um pouco pesado, mas
fonte
RegEx muito bom proposto neste site :
Se o python tiver um método String Split, ele deve funcionar ...
Em Java:
fonte
E se precisarmos cobrir um caso com entrada já não camelada:
fonte
Caso alguém precise transformar um arquivo de origem completo, aqui está um script que fará isso.
fonte
Eu tive muita sorte com este:
Isso pode, obviamente, ser otimizado para velocidade de um minúsculo pouco se você quiser.
fonte
fonte
Usar:
str.capitalize()
para converter a primeira letra da string (contida na variável str) em uma letra maiúscula e retorna a string inteira.Exemplo: Comando: "olá" .capitalize () Saída: Olá
fonte