Estou tentando remover caracteres específicos de uma string usando Python. Este é o código que estou usando agora. Infelizmente, parece não fazer nada com a string.
for char in line:
if char in " ?.!/;:":
line.replace(char,'')
Como faço isso corretamente?
python
string
immutability
Matt Phillips
fonte
fonte
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.Respostas:
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):ou substituição de expressão regular com
re.sub
Os caracteres entre colchetes constituem uma classe de caracteres . Quaisquer caracteres
line
que estejam nessa classe são substituídos pelo segundo parâmetro parasub
: 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 de
str.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 passarNone
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 deord
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
Aqui
dict.fromkeys
emap
são usados para gerar sucintamente um dicionário contendoAinda mais simples, como outra resposta coloca , crie a tabela de tradução no local:
Ou crie a mesma tabela de tradução com
str.maketrans
:* para compatibilidade com Pythons anteriores, você pode criar uma tabela de tradução "nula" para substituir
None
: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.fonte
line.translate
tem apenas um argumento e a primeira solução não vai funcionarline.translate({ord(i):None for i in '!@#$'})
"'"
para o conjunto de caracteres.notes = notes.translate({ord(i):None for i in '\"\''})
unicode_line.translate(str.maketrans('', '', '!@#$'))
. Ouunicode_line.translate(dict.fromkeys(map(ord, '!@#$')))
Estou perdendo o ponto aqui, ou é apenas o seguinte:
Coloque-o em um loop:
fonte
for char in b: a=a.replace(char,"")
string=string.replace("1","")
vez disso. Você meio que disse isso na parte do loop do seu exemplo, mas a maioria das pessoas não lerá tão longe sua resposta até que tenha mexido um pouco com o código primeiro em uma pergunta tão simples.fonte
blacklist = set('?:!/;')
e então''.join(c for c in line if c not in blacklist)
Fácil e fácil com
re.sub
expressão regular a partir do Python 3.5Exemplo
Explicação
Nas expressões regulares (regex),
|
é um OR lógico e\
escapa de espaços e caracteres especiais que podem ser comandos reais de regex. Considerando quesub
significa substituição, neste caso com a cadeia vazia''
.fonte
Para o requisito inverso de permitir apenas determinados caracteres em uma sequência, você pode usar expressões regulares com um operador de complemento definido
[^ABCabc]
. Por exemplo, para remover tudo, exceto letras ascii, dígitos e o hífen:Na documentação da expressão regular do python :
fonte
O autor da pergunta quase o pegou. Como a maioria das coisas em Python, a resposta é mais simples do que você pensa.
Você não precisa executar o loop aninhado if / for, mas precisa verificar cada caractere individualmente.
fonte
fonte
fonte
Strings são imutáveis em Python. O
replace
método retorna uma nova sequência após a substituição. Tentar:fonte
line
.Fiquei surpreso que ninguém ainda tivesse recomendado o uso da função de filtro embutido .
Digamos que queremos filtrar tudo o que não é um número. Usando o método interno do filtro "... é equivalente à expressão do gerador (item para item em iterável se função (item))" [ Python 3 Builtins: Filter ]
No Python 3, isso retorna
Para obter uma sequência impressa,
Não sei como filtrar é classificado em termos de eficiência, mas é bom saber como usar ao fazer a compreensão de listas e coisas do tipo.
ATUALIZAR
Logicamente, como o filtro funciona, você também pode usar a compreensão da lista e, pelo que li, deve ser mais eficiente, porque lambdas são os gerentes de fundos de hedge de wall street do mundo das funções de programação. Outra vantagem é que é uma linha que não requer nenhuma importação. Por exemplo, usando a mesma string 's' definida acima,
É isso aí. O retorno será uma sequência de todos os caracteres que são dígitos na sequência original.
Se você tiver uma lista específica de caracteres aceitáveis / inaceitáveis, precisará ajustar apenas a parte 'se' da compreensão da lista.
ou alternativamente,
fonte
operator.contains
se você estiver usando um delambda
qualquer maneira.lambda x: operator.contains(intsList, x)
deve ser escritolambda x: x in intsList
ou, se você estiver tentando obter a verificação do nível C,intsList.__contains__
(de maneira algumalambda
) fará o truque.Usando
filter
, você precisaria apenas de uma linhaIsso trata a string como iterável e verifica todos os caracteres se o
lambda
retornoTrue
:fonte
Aqui estão algumas maneiras possíveis de realizar esta tarefa:
PS: Em vez de usar "?.! / ;:", os exemplos usam as vogais ... e sim, "murcielago" é a palavra em espanhol para dizer morcego ... palavra engraçada, pois contém todas as vogais :)
PS2: se você estiver interessado em desempenho, poderá medir essas tentativas com um código simples como:
Na minha caixa você teria:
Parece que a tentativa4 é a mais rápida para essa entrada específica.
fonte
list
in desnecessárioattempt1
e a tupla pode ser reescrita"aeiou"
para simplificar (remover[
e]
se transformará em um gerador sem criar uma lista). Você cria toneladas de strings intermediários descartáveisattemt2
, usa vários aplicativos de regex nosattempt3
quais pode usarr'[aeiou]'
em uma única passagem. cada um tem falhas - seu bom ver diferentes maneiras de fazer as coisas, mas por favor corrigi-los para serem bons tentativas bemAqui está minha versão compatível com Python 2/3. Desde que a API de conversão mudou.
fonte
dict.fromkeys(map(ord, '!@#$'))
para criar o mapa.map
geralmente é menos legível do que uma compreensão de lista / dict / set / generator. Tanto que Guido queria removê- lo do idioma . O usofromkeys
também é um pouco inteligente e requer uma verificação de documento.str.maketrans('', '', chars)
, que lida com aord
conversão e adict
construção de uma só vez (sem mencionar que é bastante mais óbvio na intenção, pois foi projetado para emparelharstr.translate
).fonte
'
como uma sequência. docs.python.org/2/library/re.htmlQue tal agora:
fonte
Você também pode usar uma função para substituir diferentes tipos de expressão regular ou outro padrão pelo uso de uma lista. Com isso, você pode misturar expressões regulares, classe de caracteres e padrão de texto realmente básico. É realmente útil quando você precisa substituir muitos elementos, como os HTML.
* NB: funciona com Python 3.x
Na função string_cleanup, sua string x e sua lista não são desejadas como argumentos. Para cada item nessa lista de elementos ou padrão, se for necessário um substituto, isso será feito.
A saída:
fonte
Meu método que eu usaria provavelmente não funcionaria tão eficientemente, mas é extremamente simples. Posso remover vários caracteres em diferentes posições ao mesmo tempo, usando fatias e formatação. Aqui está um exemplo:
Isso resultará em 'removido' mantendo a palavra 'isto'.
A formatação pode ser muito útil para imprimir variáveis no meio de uma sequência de impressão. Ele pode inserir qualquer tipo de dados usando um % seguido pelo tipo de dados da variável; todos os tipos de dados podem usar % se flutuadores (também conhecidos como decimais) e números inteiros podem usar % d .
O fatiamento pode ser usado para um controle intrincado sobre as strings. Quando coloco as palavras [: 3] , ele permite selecionar todos os caracteres da sequência desde o início (os dois pontos estão antes do número, isso significa 'do começo para') até o 4º caractere (inclui o 4º personagem). O motivo 3 é igual à 4ª posição é porque o Python começa em 0. Então, quando eu coloco a palavra [-1:] , significa o segundo último caractere até o fim (os dois pontos estão atrás do número). Colocar -1 fará com que o Python conte desde o último caractere, e não o primeiro. Novamente, o Python começará em 0. Portanto, a palavra [-1:] basicamente significa 'do segundo último caractere até o final da string.
Portanto, cortando os caracteres antes do personagem que eu quero remover e depois e colocando-os juntos, posso remover o personagem indesejado. Pense nisso como uma salsicha. No meio está sujo, então eu quero me livrar dele. Simplesmente corto as duas pontas que quero e depois as uno sem a parte indesejada no meio.
Se eu quiser remover vários caracteres consecutivos, basta mudar os números no [] (parte de fatiar). Ou, se quiser remover vários caracteres de diferentes posições, posso simplesmente colocar várias fatias de uma só vez.
Exemplos:
removido é igual a 'legal'.
removido é igual a 'macs'.
Nesse caso, [3: 5] significa caractere na posição 3 a caractere na posição 5 (excluindo o caractere na posição final).
Lembre-se, o Python começa a contar em 0 , então você também precisará.
fonte
Tente este:
Este método funciona bem no python 3.5.2
fonte
Você pode usar a substituição da expressão regular do módulo re. Usar a expressão ^ permite escolher exatamente o que você deseja da sua string.
A saída para isso seria "Thisisabsurd". Somente as coisas especificadas após o símbolo ^ aparecerão.
fonte
O método string
replace
não modifica a string original. Deixa o original sozinho e retorna uma cópia modificada.O que você quer é algo como:
line = line.replace(char,'')
No entanto, a criação de uma nova sequência toda vez que um caractere é removido é muito ineficiente. Eu recomendo o seguinte:
fonte
Abaixo um .. sem usar o conceito de expressão regular ..
fonte
No Python 3.5
por exemplo,
Para remover todo o número da string
fonte
você pode usar set
fonte
Divisão recursiva: s = string; chars = caracteres a serem removidos
exemplo:
fonte
# para cada arquivo em um diretório, renomeie o nome do arquivo
fonte
Mesmo a abordagem abaixo funciona
resultado:
abcde
fonte
fonte