strip retira os caracteres dados das duas extremidades da string; no seu caso, retira ".", "c", "o" e "m".
truppo
6
Ele também removerá esses caracteres da frente da string. Se você quiser apenas para remover a partir do final, RSTRIP uso ()
Andre Miller
42
Sim. str.strip não faz o que você pensa que faz. str.strip remove qualquer um dos caracteres especificados desde o início e o final da string. Então, "acbacda" .strip ("ad") fornece 'cbac'; o a no início e o da no final foram retirados. Felicidades.
scvalex
2
Além disso, isso remove os caracteres em qualquer ordem : "site.ocm"> "site".
Eric O Lebigot
11
@scvalex, wow só percebi isso ter usado dessa maneira para as idades - é perigoso porque o código muitas vezes acontece de trabalho de qualquer maneira
o Flash
Respostas:
556
stripnão significa "remover esta substring". x.strip(y)trata ycomo um conjunto de caracteres e retira todos os caracteres desse conjunto dos fins de x.
Sim, acho que o primeiro exemplo, com o teste endswith (), seria o melhor; a regex envolveria alguma penalidade de desempenho (analisando a regex etc.). Eu não aceitaria o rsplit (), mas é porque não sei o que você está exatamente tentando alcançar. Eu acho que está removendo o .com se e somente se ele aparece no final do URL? A solução rsplit iria dar-lhe problemas se você usá-lo em nomes de domínio como 'www.commercialthingie.co.uk'
Steef
13
url = url[:-4] if any(url.endswith(x) for x in ('.com','.net')) else url
Burhan Khalid
11
e se eu escrever EXAMLPLE.COMnomes de domínio não diferenciam maiúsculas de minúsculas. (Este é um voto para a solução regex)
Jasen
3
Não é uma reescrita, a rsplit()solução não tem o mesmo comportamento que a endswith()string original não possui a substring no final, mas em algum lugar no meio. Por exemplo: "www.comeandsee.com".rsplit(".com",1)[0] == "www.comeandsee"mas"www.comeandsee.net".rsplit(".com",1)[0] == "www"
Steef
11
A sintaxe s[:-n]tem uma ressalva: pois n = 0, isso não retorna a string com os últimos zero caracteres cortados, mas a string vazia.
BlenderBender
90
Se você tem certeza de que a string aparece apenas no final, a maneira mais simples seria usar 'replace':
que também substituirá o URL como www.computerhope.com. faça uma verificação com endswith()e deve ficar bem.
ghostdog74
72
"www.computerhope.com".endswith(".com")é verdade, ainda vai quebrar!
11
"Se você tem certeza de que a string aparece apenas no final", você quer dizer "Se você tem certeza de que a substring aparece apenas uma vez"? substituir parece funcionar também quando o substring está no meio, mas como o outro comentário sugere que irá substituir qualquer ocorrência do substring, por que deveria ser no final Eu não entendo
idclev 463035818
49
def strip_end(text, suffix):ifnot text.endswith(suffix):return text
return text[:len(text)-len(suffix)]
Isso deve ser mais eficiente do que os métodos utilizados, split()pois nenhum novo objeto de lista é criado e esta solução funciona para cadeias de caracteres com vários pontos.
Uau, isso é um bom truque. Não consegui fazer com que isso falhasse, mas também tive dificuldade em pensar em como isso poderia falhar. Eu gosto, mas é muito "mágico", difícil de saber o que isso faz apenas olhando para ele. Eu tive que processar mentalmente cada parte da linha para "entender".
DevPlayer
14
Isso falhará se a seqüência de caracteres pesquisada NÃO estiver presente e, erroneamente, o último caractere será removido.
precisa saber é o seguinte
25
Depende do que você sabe sobre o seu URL e exatamente o que você está tentando fazer. Se você souber que sempre terminará em '.com' (ou '.net' ou '.org'),
url=url[:-4]
é a solução mais rápida. Se for um URL mais geral, é melhor procurar na biblioteca urlparse que acompanha o python.
Se você, por outro lado, simplesmente deseja remover tudo após o final '.' em uma corda então
url.rsplit('.',1)[0]
vai funcionar. Ou se você quiser apenas quer tudo até o primeiro '.' Então tente
Se você precisar remover algum final de uma string, caso exista, não faça nada. Minhas melhores soluções. Você provavelmente desejará usar uma das 2 primeiras implementações, no entanto, incluímos a 3ª por integridade.
Para um sufixo constante:
def remove_suffix(v, s):return v[:-len(s)if v.endswith(s)else v
remove_suffix("abc.com",".com")=='abc'
remove_suffix("abc",".com")=='abc'
Para uma coleção de sufixos constantes, o caminho assintoticamente mais rápido para um grande número de chamadas:
def remove_suffix_preprocess(*suffixes):
suffixes = set(suffixes)try:
suffixes.remove('')exceptKeyError:passdef helper(suffixes, pos):if len(suffixes)==1:
suf = suffixes[0]
l =-len(suf)
ls = slice(0, l)returnlambda v: v[ls]if v.endswith(suf)else v
si = iter(suffixes)
ml = len(next(si))
exact =Falsefor suf in si:
l = len(suf)if-l == pos:
exact =Trueelse:
ml = min(len(suf), ml)
ml =-ml
suffix_dict ={}for suf in suffixes:
sub = suf[ml:pos]if sub in suffix_dict:
suffix_dict[sub].append(suf)else:
suffix_dict[sub]=[suf]if exact:del suffix_dict['']for key in suffix_dict:
suffix_dict[key]= helper([s[:pos]for s in suffix_dict[key]],None)returnlambda v: suffix_dict.get(v[ml:pos],lambda v: v)(v[:pos])else:for key in suffix_dict:
suffix_dict[key]= helper(suffix_dict[key], ml)returnlambda v: suffix_dict.get(v[ml:pos],lambda v: v)(v)return helper(tuple(suffixes),None)
domain_remove = remove_suffix_preprocess(".com",".net",".edu",".uk",'.tv','.co.uk','.org.uk')
o final provavelmente é significativamente mais rápido no pypy do que no cpython. A variante regex provavelmente é mais rápida que isso para praticamente todos os casos que não envolvam dicionários enormes de sufixos em potencial que não podem ser facilmente representados como regex pelo menos no cPython.
No PyPy, a variante regex é quase certamente mais lenta para um grande número de chamadas ou seqüências longas, mesmo que o módulo re use um mecanismo regex de compilação do DFA, pois a grande maioria da sobrecarga do lambda será otimizada pelo JIT.
No cPython, no entanto, o fato de o código c em execução para o regex comparar quase certamente as vantagens algorítmicas da versão da coleção de sufixos em quase todos os casos.
Ele funciona com qualquer extensão, com outros pontos potenciais existentes no nome do arquivo também. Simplesmente divide a string como uma lista de pontos e junta-a sem o último elemento.
No meu caso, eu precisava criar uma exceção, então fiz:
classUnableToStripEnd(Exception):"""A Exception type to indicate that the suffix cannot be removed from the text."""@staticmethoddef get_exception(text, suffix):returnUnableToStripEnd("Could not find suffix ({0}) on text: {1}.".format(suffix, text))def strip_end(text, suffix):"""Removes the end of a string. Otherwise fails."""ifnot text.endswith(suffix):raiseUnableToStripEnd.get_exception(text, suffix)return text[:len(text)-len(suffix)]
Mas este não é o ponto da questão. Foi solicitado apenas a remoção de uma substring conhecida do final de outra. Isso funciona exatamente como o esperado.
Sua resposta para o Python 3.9 é uma duplicata desta resposta acima. Sua resposta para versões anteriores também foi respondida várias vezes neste segmento e não retornaria nada se a sequência não tivesse o sufixo.
Respostas:
strip
não significa "remover esta substring".x.strip(y)
tratay
como um conjunto de caracteres e retira todos os caracteres desse conjunto dos fins dex
.Em vez disso, você pode usar
endswith
e fatiar:Ou usando expressões regulares :
fonte
url = url[:-4] if any(url.endswith(x) for x in ('.com','.net')) else url
EXAMLPLE.COM
nomes de domínio não diferenciam maiúsculas de minúsculas. (Este é um voto para a solução regex)rsplit()
solução não tem o mesmo comportamento que aendswith()
string original não possui a substring no final, mas em algum lugar no meio. Por exemplo:"www.comeandsee.com".rsplit(".com",1)[0] == "www.comeandsee"
mas"www.comeandsee.net".rsplit(".com",1)[0] == "www"
s[:-n]
tem uma ressalva: poisn = 0
, isso não retorna a string com os últimos zero caracteres cortados, mas a string vazia.Se você tem certeza de que a string aparece apenas no final, a maneira mais simples seria usar 'replace':
fonte
www.computerhope.com
. faça uma verificação comendswith()
e deve ficar bem."www.computerhope.com".endswith(".com")
é verdade, ainda vai quebrar!fonte
return text[:-len(suffix)]
Como parece que ninguém apontou isso ainda:
Isso deve ser mais eficiente do que os métodos utilizados,
split()
pois nenhum novo objeto de lista é criado e esta solução funciona para cadeias de caracteres com vários pontos.fonte
Depende do que você sabe sobre o seu URL e exatamente o que você está tentando fazer. Se você souber que sempre terminará em '.com' (ou '.net' ou '.org'),
é a solução mais rápida. Se for um URL mais geral, é melhor procurar na biblioteca urlparse que acompanha o python.
Se você, por outro lado, simplesmente deseja remover tudo após o final '.' em uma corda então
vai funcionar. Ou se você quiser apenas quer tudo até o primeiro '.' Então tente
fonte
Se você sabe que é uma extensão, então
Isso funciona igualmente bem com
abcdc.com
ouwww.abcdc.com
ouabcdc.[anything]
e é mais extensível.fonte
Em uma linha:
fonte
Que tal
url[:-4]
?fonte
.ca
ou um.co.uk
URL.Para urls (como parece fazer parte do tópico pelo exemplo dado), pode-se fazer algo assim:
Ambos produzirão:
('http://www.stackoverflow', '.com')
Isso também pode ser combinado
str.endswith(suffix)
se você precisar apenas dividir ".com" ou qualquer coisa específica.fonte
não está certo.
O que você realmente precisa escrever é
, e parece IMHO bastante sucinto.
No entanto, minha preferência pessoal é essa opção porque ela usa apenas um parâmetro:
fonte
Começando em
Python 3.9
, você pode usarremovesuffix
:fonte
Se você precisar remover algum final de uma string, caso exista, não faça nada. Minhas melhores soluções. Você provavelmente desejará usar uma das 2 primeiras implementações, no entanto, incluímos a 3ª por integridade.
Para um sufixo constante:
Para uma regex:
Para uma coleção de sufixos constantes, o caminho assintoticamente mais rápido para um grande número de chamadas:
o final provavelmente é significativamente mais rápido no pypy do que no cpython. A variante regex provavelmente é mais rápida que isso para praticamente todos os casos que não envolvam dicionários enormes de sufixos em potencial que não podem ser facilmente representados como regex pelo menos no cPython.
No PyPy, a variante regex é quase certamente mais lenta para um grande número de chamadas ou seqüências longas, mesmo que o módulo re use um mecanismo regex de compilação do DFA, pois a grande maioria da sobrecarga do lambda será otimizada pelo JIT.
No cPython, no entanto, o fato de o código c em execução para o regex comparar quase certamente as vantagens algorítmicas da versão da coleção de sufixos em quase todos os casos.
fonte
Se você deseja apenas remover a extensão:
Ele funciona com qualquer extensão, com outros pontos potenciais existentes no nome do arquivo também. Simplesmente divide a string como uma lista de pontos e junta-a sem o último elemento.
fonte
Quero repetir esta resposta como a maneira mais expressiva de fazê-lo. Obviamente, o seguinte levaria menos tempo de CPU:
No entanto, se a CPU é o gargalo, por que escrever em Python?
Quando a CPU é um gargalo, afinal? Nos motoristas, talvez.
As vantagens do uso de expressão regular são a reutilização do código. E se você quiser remover o '.me', que possui apenas três caracteres?
O mesmo código faria o truque:
fonte
No meu caso, eu precisava criar uma exceção, então fiz:
fonte
Aqui, eu tenho um código mais simples.
fonte
Supondo que você deseja remover o domínio, não importa o que seja (.com, .net, etc). Eu recomendo encontrar
.
e remover tudo a partir desse ponto.Aqui estou usando
rfind
para resolver o problema de URLs como oabcdc.com.net
que deve ser reduzido ao nomeabcdc.com
.Se você também estiver preocupado com
www.
s, verifique-os explicitamente:O 1 em substituir é para edgecases estranhos como
www.net.www.com
Se o seu URL ficar mais selvagem do que o visual, as respostas com regex com as quais as pessoas responderam.
fonte
Eu usei a função rstrip embutida para fazer o seguinte:
fonte
"test.ccom"
.Você pode usar split:
fonte
a = 'www.computerbugs.com'
isso resulta com'www
'Este é um uso perfeito para expressões regulares:
fonte
Python> = 3.9:
Python <3.9:
fonte