Substitua todos os caracteres não alfanuméricos em uma string

99

Eu tenho uma string com a qual desejo substituir qualquer caractere que não seja um caractere ou número padrão, como (az ou 0-9), por um asterisco. Por exemplo, "h ^ & ell`., | Ow] {+ orld" é substituído por "h * ell * o * w * orld". Observe que vários caracteres como "^ &" são substituídos por um asterisco. Como eu faria isso?

tchadwik
fonte

Respostas:

182

Regex para o resgate!

import re

s = re.sub('[^0-9a-zA-Z]+', '*', s)

Exemplo:

>>> re.sub('[^0-9a-zA-Z]+', '*', 'h^&ell`.,|o w]{+orld')
'h*ell*o*w*orld'
Nneonneo
fonte
7
Se você trabalha muito com Unicode, também pode precisar manter todos os símbolos Unicode não ASCII:re.sub("[\x00-\x2F\x3A-\x40\x5B-\x60\x7B-\x7F]+", " ", ":%# unicode ΣΘΙП@./\n")
zhazha
Se você quiser manter espaços em sua string, basta adicionar um espaço entre colchetes: s = re.sub ('[^ 0-9a-zA-Z] +', '*', s)
stackPusher
2
Se fizer mais de uma substituição, o desempenho será um pouco mais rápido se você pré-compilar a regex, por exemplo,import re; regex = re.compile('[^0-9a-zA-Z]+'); regex.sub('*', 'h^&ell.,|o w]{+orld')
Chris
Observe também que \Wé para caracteres que não são palavras, é quase o mesmo, mas permite o sublinhado como um caractere de palavra (não sei por quê): docs.python.org/3.6/library/re.html#index-32
JHS
36

A maneira pítônica.

print "".join([ c if c.isalnum() else "*" for c in s ])

Isso não lida com o agrupamento de vários caracteres consecutivos não correspondentes, ou seja,

"h^&i => "h**inão "h*i"como nas soluções regex.

Baloan
fonte
11

Experimentar:

s = filter(str.isalnum, s)

em Python3:

s = ''.join(filter(str.isalnum, s))

Editar: percebi que o OP deseja substituir os não caracteres por '*'. Minha resposta não se encaixa

Don
fonte
11

Use o \Wque é equivalente a [^a-zA-Z0-9_]. Verifique a documentação, https://docs.python.org/2/library/re.html

Import re
s =  'h^&ell`.,|o w]{+orld'
replaced_string = re.sub(r'\W+', '*', s)
output: 'h*ell*o*w*orld'

atualização: Esta solução também excluirá o sublinhado. Se você deseja que apenas alfabetos e números sejam excluídos, a solução por nneonneo é mais apropriada.

psun
fonte
1
Observe que \Wé equivalente a[^a-zA-Z0-9_] apenas no Python 2.x. No Python 3.x, \W+é equivalente a [^a-zA-Z0-9_]apenas se re.ASCII/ re.Aflag for usado.
Wiktor Stribiżew