Qual é a melhor maneira de remover todos os caracteres não alfanuméricos de uma string, usando Python?
As soluções apresentadas na variante PHP desta pergunta provavelmente funcionarão com alguns pequenos ajustes, mas não me parecem muito 'pitônicas'.
Para o registro, eu não quero apenas retirar períodos e vírgulas (e outras pontuações), mas também aspas, colchetes, etc.
Respostas:
Eu apenas cronometrei algumas funções por curiosidade. Nestes testes, estou removendo caracteres não alfanuméricos da string
string.printable
(parte dostring
módulo interno). O uso de compilado'[\W_]+'
epattern.sub('', str)
foi encontrado para ser o mais rápido.fonte
valid_characters = string.ascii_letters + string.digits
seguido porjoin(ch for ch in string.printable if ch in valid_characters)
e foi 6 microssegundos mais rápido do que aisalnum()
opção ainda muito mais lento do que o regexp embora..pattern.sub('', string.printable)
- bobagem chamar re.sub quando você tiver um objeto RE! -).re.compile('[\W_]+', re.UNICODE)
para torná-lo seguro para Unicode.Expressões regulares para o resgate:
fonte
\W
também manterá sublinhados.Use o método str.translate () .
Presumindo que você faça isso com frequência:
(1) Crie uma sequência contendo todos os caracteres que você deseja excluir:
(2) Sempre que você deseja torcer uma corda:
O custo da instalação provavelmente se compara favoravelmente ao re.compile; o custo marginal é bem menor:
Nota: Usar string.printable como dados de referência fornece ao padrão '[\ W _] +' uma vantagem injusta ; todos os caracteres não alfanuméricos estão em um grupo ... em dados típicos, haveria mais de uma substituição a ser feita:
Aqui está o que acontece se você der ao re.sub um pouco mais de trabalho a fazer:
fonte
string.punctuation
Em vez de''.join(c for c in map(chr, range(256)) if not c.isalnum())
str
objetos, mas não paraunicode
objetos..join()
?Você poderia tentar:
fonte
fonte
E se:
Isso funciona usando a compreensão de lista para produzir uma lista dos caracteres,
InputString
se eles estiverem presentes nas combinaçõesascii_letters
edigits
seqüências de caracteres. Em seguida, junta a lista em uma sequência.fonte
Como resultado de algumas outras respostas aqui, ofereço uma maneira realmente simples e flexível de definir um conjunto de caracteres aos quais você deseja limitar o conteúdo de uma string. Nesse caso, estou permitindo sublinhar e trace alfanumérico PLUS. Basta adicionar ou remover caracteres do meu
PERMITTED_CHARS
conforme o seu caso de uso.fonte
string.digits + string.ascii_letters + '_-'
.SPECIAL_CHARS = '_-'
e, em seguida, usarstring.digits + string.ascii_letters + SPECIAL_CHARS
fonte
e for e in sent
e verifica viaif e.isalpha()
declaração se o caractere atual é um símbolo alfabético; se assim for - junta-o àsent
variável viasent = "".join()
e todos os símbolos não alfabéticos serão substituídos por""
(string vazia) porque dejoin
função.fonte
Tempo com seqüências aleatórias de caracteres de impressão ASCII:
Resultado (Python 3.7):
str.maketrans
&str.translate
é mais rápido, mas inclui todos os caracteres não ASCII.re.compile
&pattern.sub
é mais lento, mas é mais rápido que''.join
&filter
.fonte
Se entendi corretamente, a maneira mais fácil é usar a expressão regular, pois fornece muita flexibilidade, mas o outro método simples é usar o seguinte para o loop: o código com o exemplo. Também contei a ocorrência de palavras e armazenei no dicionário.
classifique-o se esta resposta for útil!
fonte