Strings em Python são imutáveis (não podem ser alteradas). Por isso, o efeito de line.replace(...)
é apenas criar uma nova string, em vez de alterar a antiga. Você precisa religá-lo (atribuí-lo) line
para que essa variável aceite o novo valor, com esses caracteres removidos.
Além disso, a maneira como você está fazendo isso será lenta, relativamente. Também é provável que seja um pouco confuso para os pythonators experientes, que verão uma estrutura duplamente aninhada e pensarão por um momento que algo mais complicado está acontecendo.
A partir do Python 2.6 e versões mais recentes do Python 2.x *, você pode usar str.translate
(mas leia as diferenças do Python 3):
line = line.translate(None, '!@#$')
ou substituição de expressão regular com re.sub
import re
line = re.sub('[!@#$]', '', line)
Os caracteres entre colchetes constituem uma classe de caracteres . Quaisquer caracteres line
que estejam nessa classe são substituídos pelo segundo parâmetro para sub
: uma sequência vazia.
No Python 3, as strings são Unicode. Você terá que traduzir um pouco diferente. O kevpie menciona isso em um comentário em uma das respostas, e está anotado na documentação destr.translate
.
Ao chamar o translate
método de uma seqüência de caracteres Unicode, você não pode passar o segundo parâmetro que usamos acima. Você também não pode passar None
como o primeiro parâmetro. Em vez disso, você passa uma tabela de tradução (geralmente um dicionário) como o único parâmetro. Esta tabela mapeia os valores ordinais dos caracteres (ou seja, o resultado de ord
invocá-los) para os valores ordinais dos caracteres que devem substituí-los, ou - útil para nós - None
para indicar que eles devem ser excluídos.
Então, para fazer a dança acima com uma string Unicode, você chamaria algo como
translation_table = dict.fromkeys(map(ord, '!@#$'), None)
unicode_line = unicode_line.translate(translation_table)
Aqui dict.fromkeys
e map
são usados para gerar sucintamente um dicionário contendo
{ord('!'): None, ord('@'): None, ...}
Ainda mais simples, como outra resposta coloca , crie a tabela de tradução no local:
unicode_line = unicode_line.translate({ord(c): None for c in '!@#$'})
Ou crie a mesma tabela de tradução com str.maketrans
:
unicode_line = unicode_line.translate(str.maketrans('', '', '!@#$'))
* para compatibilidade com Pythons anteriores, você pode criar uma tabela de tradução "nula" para substituir None
:
import string
line = line.translate(string.maketrans('', ''), '!@#$')
Aqui string.maketrans
é usado para criar uma tabela de conversão , que é apenas uma sequência que contém os caracteres com valores ordinais de 0 a 255.
filter
função e uma expressão lambda:filter(lambda ch: ch not in " ?.!/;:", line)
. Bastante conciso e eficiente também, eu acho. Obviamente, ele retorna uma nova string à qual você terá que atribuir um nome.