Qual é a maneira pythônica de dividir uma string antes das ocorrências de um determinado conjunto de caracteres?
Por exemplo, desejo dividir
'TheLongAndWindingRoad'
em qualquer ocorrência de uma letra maiúscula (possivelmente exceto a primeira) e obter
['The', 'Long', 'And', 'Winding', 'Road']
.
Edit: Ele também deve dividir ocorrências únicas, ou seja, de 'ABC'
que eu gostaria de obter
['A', 'B', 'C']
.
'[a-zA-Z][^A-Z]*'
como regex.print(re.findall('^[a-z]+|[A-Z][^A-Z]*', 'theLongAndWindingRoad'))
Aqui está uma solução alternativa de regex. O problema pode ser reprogramado como "como faço para inserir um espaço antes de cada letra maiúscula, antes de fazer a divisão":
Isso tem a vantagem de preservar todos os caracteres que não sejam de espaço em branco, o que a maioria das outras soluções não faz.
fonte
Se você quiser
"It'sATest"
dividir,["It's", 'A', 'Test']
mude o rexeg para"[A-Z][a-z']*"
fonte
drops
todas as palavras regulares (apenas alfa simples) que não começam com uma letra maiúscula. Duvido que fosse essa a intenção do OP.Uma variação da solução de @ChristopheD
fonte
Use um olhar à frente:
No Python 3.7, você pode fazer isso:
E produz:
fonte
ou
fonte
[s for s in re.compile(r"([A-Z][^A-Z]*)").split( "TheLongAndWindingRoad") if s]
dando['The', 'Long', 'And', 'Winding', 'Road']
filter
é o mesmo que a compreensão de lista com uma condição. Você tem algo contra isso?filter(lambdaconditionfunc, ...)
b) em Python 3,filter()
retorna um iterador. Portanto, eles não serão totalmente equivalentes. c) Espero quefilter()
seja mais lento tambémfonte
Eu acho que uma resposta melhor pode ser para dividir a string em palavras que não terminam em uma capital. Isso resolveria o caso em que a string não começa com uma letra maiúscula.
exemplo:
fonte
Solução alternativa (se você não gosta de regexes explícitas):
fonte
Outro sem regex e a capacidade de manter letras maiúsculas contíguas, se desejado
fonte
Isso é possível com a
more_itertools.split_before
ferramenta.more_itertools
é um pacote de terceiros com mais de 60 ferramentas úteis, incluindo implementações para todas as receitas de itertools originais , o que elimina sua implementação manual.fonte
Uma maneira alternativa sem usar regex ou enumerar:
Acho que é mais claro e simples, sem encadear muitos métodos ou usar uma longa lista de compreensão que pode ser difícil de ler.
fonte
Uma forma alternativa usando
enumerate
eisupper()
Código:
Resultado:
fonte
Compartilhando o que me veio à mente quando li a postagem. Diferente de outras postagens.
fonte
A forma pitônica pode ser:
Funciona bem para Unicode, evitando re / re2.
fonte
Substitua todas as letras maiúsculas 'L' no dado com um espaço vazio mais a letra "L". Podemos fazer isso usando a compreensão de lista ou podemos definir uma função para fazer isso da seguinte maneira.
Se você escolher seguir uma função, veja como.
No caso do exemplo dado:
Mas na maioria das vezes que estamos dividindo uma frase em letras maiúsculas, geralmente queremos manter as abreviaturas que são tipicamente um fluxo contínuo de letras maiúsculas. O código abaixo ajudaria.
Obrigado.
fonte