sirve - string en python
Eliminando todo excepto los caracteres alfanuméricos de una cadena en Python (8)
¿Cuál es la mejor manera de eliminar todos los caracteres no alfanuméricos de una cadena, usando Python?
Las soluciones presentadas en la variante de PHP de esta pregunta probablemente funcionarán con algunos ajustes menores, pero no me parecen muy "pitónicos".
Para el registro, no solo quiero quitar puntos y comas (y otros signos de puntuación), sino también comillas, corchetes, etc.
Como resultado de algunas otras respuestas aquí, ofrezco una manera realmente simple y flexible de definir un conjunto de caracteres a los que desea limitar el contenido de una cadena. En este caso, estoy permitiendo alfanuméricos PLUS guiones y subrayado. Simplemente agregue o elimine caracteres de mis PERMITTED_CHARS
según corresponda a su caso de uso.
PERMITTED_CHARS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-"
someString = "".join(c for c in someString if c in PERMITTED_CHARS)
Expresiones regulares al rescate:
import re
re.sub(r''/W+'', '''', your_string)
Por definición de Python
''/W
==[^a-zA-Z0-9_]
, que excluye todos losnumbers
,letters
y_
Qué tal si:
def ExtractAlphanumeric(InputString):
from string import ascii_letters, digits
return "".join([ch for ch in InputString if ch in (ascii_letters + digits)])
Esto funciona mediante el uso de la lista de comprensión para producir una lista de los caracteres en InputString
si están presentes en las ascii_letters
combinadas de ascii_letters
y digits
. A continuación, une la lista en una cadena.
Tu podrías intentar:
print ''''.join(ch for ch in some_string if ch.isalnum())
Utilice el método str.translate () .
Suponiendo que va a hacer esto a menudo:
(1) Una vez, cree una cadena que contenga todos los caracteres que desea eliminar:
delchars = ''''.join(c for c in map(chr, range(256)) if not c.isalnum())
(2) Cada vez que quieras apretar una cuerda:
scrunched = s.translate(None, delchars)
El costo de instalación probablemente se compara favorablemente con re.compile; El costo marginal es mucho menor:
C:/junk>/python26/python -mtimeit -s"import string;d=''''.join(c for c in map(chr,range(256)) if not c.isalnum());s=string.printable" "s.translate(None,d)"
100000 loops, best of 3: 2.04 usec per loop
C:/junk>/python26/python -mtimeit -s"import re,string;s=string.printable;r=re.compile(r''[/W_]+'')" "r.sub('''',s)"
100000 loops, best of 3: 7.34 usec per loop
Nota: el uso de string.printable como datos de referencia le da al patrón ''[/ W _] +'' una ventaja injusta ; todos los caracteres no alfanuméricos están en un grupo ... en los datos típicos, habría más de una sustitución que hacer:
C:/junk>/python26/python -c "import string; s = string.printable; print len(s),repr(s)"
100 ''0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&/'()*+,-./:;=>?@[//]^_`{|}~ /t/n/r/x0b/x0c''
Esto es lo que sucede si le das a re.sub un poco más de trabajo por hacer:
C:/junk>/python26/python -mtimeit -s"d=''''.join(c for c in map(chr,range(256)) if not c.isalnum());s=''foo-''*25" "s.translate(None,d)"
1000000 loops, best of 3: 1.97 usec per loop
C:/junk>/python26/python -mtimeit -s"import re;s=''foo-''*25;r=re.compile(r''[/W_]+'')" "r.sub('''',s)"
10000 loops, best of 3: 26.4 usec per loop
Acabo de programar algunas funciones por curiosidad. En estas pruebas, estoy eliminando caracteres no alfanuméricos de la cadena string.printable
(parte del módulo de string
incorporado).
$ python -m timeit -s /
"import string" /
"''''.join(ch for ch in string.printable if ch.isalnum())"
10000 loops, best of 3: 57.6 usec per loop
$ python -m timeit -s /
"import string" /
"filter(str.isalnum, string.printable)"
10000 loops, best of 3: 37.9 usec per loop
$ python -m timeit -s /
"import re, string" /
"re.sub(''[/W_]'', '''', string.printable)"
10000 loops, best of 3: 27.5 usec per loop
$ python -m timeit -s /
"import re, string" /
"re.sub(''[/W_]+'', '''', string.printable)"
100000 loops, best of 3: 15 usec per loop
$ python -m timeit -s /
"import re, string; pattern = re.compile(''[/W_]+'')" /
"pattern.sub('''', string.printable)"
100000 loops, best of 3: 11.2 usec per loop
>>> import re
>>> string = "Kl13@£$%[};''/""
>>> pattern = re.compile(''/W'')
>>> string = re.sub(pattern, '''', string)
>>> print string
Kl13
for char in my_string:
if not char.isalnum():
my_string = my_string.replace(char,"")