Qual é o ponto de '/segment/segment/'.split('/')
voltar ['', 'segment', 'segment', '']
?
Observe os elementos vazios. Se você estiver dividindo em um delimitador que por acaso está na posição um e no final de uma string, que valor extra isso dá para ter a string vazia retornada de cada extremidade?
strip()
retirar os caracteres de divisão'/segment/segment/'.strip('/').split('/')
Respostas:
str.split
complementosstr.join
, entãoobtém de volta a string original.
Se as strings vazias não estivessem lá, a primeira e a última
'/'
estariam faltando após ojoin()
fonte
De forma mais geral, para remover strings vazias retornadas nos
split()
resultados, você pode querer examinar afilter
função.Exemplo:
retorna
fonte
list(...)
.Existem dois pontos principais a serem considerados aqui:
'/segment/segment/'.split('/')
seja igual a['segment', 'segment']
é razoável, mas isso perde informações. Sesplit()
funcionou do jeito que você queria, se eu disser issoa.split('/') == ['segment', 'segment']
, você não pode me dizer o quea
foi.'a//b'.split()
ser?['a', 'b']
?, ou['a', '', 'b']
? Ou seja, devesplit()
mesclar delimitadores adjacentes? Se for o caso, será muito difícil analisar dados delimitados por um caractere e alguns dos campos podem estar vazios. Estou bastante certo de que há muitas pessoas que fazem que os valores vazios no resultado para o caso acima!No final, tudo se resume a duas coisas:
Consistência: se eu tiver
n
delimitadores, ema
, recebo osn+1
valores de volta depois desplit()
.Deve ser possível fazer coisas complexas e fáceis de fazer coisas simples: se você quiser ignorar strings vazias como resultado de
split()
, você sempre pode fazer:mas se não quisermos ignorar os valores vazios, devemos ser capazes.
A linguagem precisa escolher uma definição de
split()
- há muitos casos de uso diferentes para atender aos requisitos de todos como padrão. Acho que a escolha do Python é boa e a mais lógica. (À parte, uma das razões pelas quais eu não gosto do Cstrtok()
é porque ele mescla delimitadores adjacentes, tornando extremamente difícil fazer análise / tokenização séria com ele.)Há uma exceção:
a.split()
sem um argumento comprime espaços em branco consecutivos, mas pode-se argumentar que essa é a coisa certa a se fazer nesse caso. Se você não quiser o comportamento, você sempre podea.split(' ')
.fonte
python3 -m timeit "import re ; re.sub(' +', ' foo bar baz ', '').split(' ')"
-> 875 nseg por loop;python3 -m timeit "[token for token in ' foo bar baz '.split(' ') if token]"
-> 616 nseg por loopTer
x.split(y)
sempre retornado uma lista de1 + x.count(y)
itens é uma regularidade preciosa - como @ gnibbler já apontou, ele fazsplit
ejoin
exatas inversos um do outro (como eles obviamente deveriam ser), ele também mapeia precisamente a semântica de todos os tipos de registros unidos por delimitadores ( comocsv
linhas de arquivo [[net of Quoting Issues]], linhas de/etc/group
Unix, e assim por diante), permite (como a resposta de @ Roman mencionou) verificações fáceis para (por exemplo) caminhos absolutos vs relativos (em caminhos de arquivo e URLs), e assim por diante.Outra maneira de ver isso é que você não deve jogar informações pela janela sem qualquer ganho. A que ganharíamos fazendo
x.split(y)
equivalente ax.strip(y).split(y)
? Nada, é claro - é fácil de usar a segunda forma quando isso é o que você quer dizer, mas se a primeira forma foi arbitrariamente entender-se o segundo, você tem muito trabalho a fazer quando você não quer que o primeiro ( o que está longe de ser raro, como o parágrafo anterior indica).Mas, na verdade, pensar em termos de regularidade matemática é a maneira mais simples e geral de aprender a projetar APIs passáveis. Para dar um exemplo diferente, é muito importante que, para qualquer
x
ey
x == x[:y] + x[y:]
- o que indica imediatamente por que um extremo de um corte deve ser excluído. Quanto mais simples a afirmação invariável que você pode formular, mais provável é que a semântica resultante seja o que você precisa nos usos da vida real - parte do fato místico de que a matemática é muito útil para lidar com o universo.Tente formular o invariante para um
split
dialeto no qual os delimitadores iniciais e finais são casados especiais ... contra-exemplo: métodos de string comoisspace
não são maximamente simples -x.isspace()
é equivalente ax and all(c in string.whitespace for c in x)
- aquele líder bobox and
é o motivo pelo qual você tantas vezes se encontra codificandonot x or x.isspace()
, para voltar à simplicidade que deveria ter sido projetada nosis...
métodos de string (em que uma string vazia "é" qualquer coisa que você quiser - ao contrário do senso comum do homem da rua, talvez [[conjuntos vazios, como zero & c, sempre confundi a maioria das pessoas ;-)]], mas em total conformidade com o óbvio bom senso matemático refinado ! -).fonte
Não tenho certeza de que tipo de resposta você está procurando? Você obtém três correspondências porque tem três delimitadores. Se você não quiser aquele vazio, basta usar:
fonte
Bem, permite que você saiba que havia um delimitador ali. Portanto, ver 4 resultados permite que você saiba que você tinha 3 delimitadores. Isso lhe dá o poder de fazer o que quiser com essas informações, em vez de fazer com que o Python elimine os elementos vazios e, em seguida, faça com que você verifique manualmente os delimitadores iniciais ou finais, se precisar saber.
Exemplo simples: digamos que você queira verificar nomes de arquivo absolutos vs. relativos. Desta forma, você pode fazer tudo com a divisão, sem ter que verificar também qual é o primeiro caractere do seu nome de arquivo.
fonte
Considere este exemplo mínimo:
split
deve fornecer o que está antes e depois do delimitador'/'
, mas não há outros caracteres. Portanto, ele tem que fornecer a string vazia, que tecnicamente precede e segue o'/'
, porque'' + '/' + '' == '/'
.fonte