2010-10-10 18 views
40

Quiero eliminar cualquier paréntesis de una cadena. ¿Por qué esto no funciona correctamente?Python strip() ¿múltiples caracteres?

>>> name = "Barack (of Washington)" 
>>> name = name.strip("(){}<>") 
>>> print name 
Barack (of Washington 

Respuesta

31

hice una prueba de tiempo aquí, utilizando cada método 100000 veces en un bucle. Los resultados me sorprendieron. (Los resultados todavía me sorprende después de la edición en respuesta a las críticas válidas en los comentarios.)

Aquí está la secuencia de comandos:

import timeit 

bad_chars = '(){}<>' 

setup = """import re 
import string 
s = 'Barack (of Washington)' 
bad_chars = '(){}<>' 
rgx = re.compile('[%s]' % bad_chars)""" 

timer = timeit.Timer('o = "".join(c for c in s if c not in bad_chars)', setup=setup) 
print "List comprehension: ", timer.timeit(100000) 


timer = timeit.Timer("o= rgx.sub('', s)", setup=setup) 
print "Regular expression: ", timer.timeit(100000) 

timer = timeit.Timer('for c in bad_chars: s = s.replace(c, "")', setup=setup) 
print "Replace in loop: ", timer.timeit(100000) 

timer = timeit.Timer('s.translate(string.maketrans("", "",), bad_chars)', setup=setup) 
print "string.translate: ", timer.timeit(100000) 

Éstos son los resultados:

List comprehension: 0.631745100021 
Regular expression: 0.155561923981 
Replace in loop: 0.235936164856 
string.translate: 0.0965719223022 

Resultados en otras carreras sigue un patrón similar. Si la velocidad no es la principal preocupación, sin embargo, todavía creo que string.translate no es el más fácil de leer; los otros tres son más obvios, aunque más lentos en diversos grados.

+1

gracias por esto - cuestión educativa, no sólo me entero de que la tira() no hace lo que yo pensaba, también aprendí otras tres maneras de lograr lo que quería y ¡cuál fue el más rápido! – AP257

+1

no funcionará para unicode: translate() solo toma un argumento (tabla) con unicode. – rikAtee

+4

menos 1: Para hacer algo acerca de la velocidad, que debería ser sobre la claridad y robustez del código. – jwg

7

strip solamente tiras caracteres de la parte frontal y posterior de la cadena.

Para eliminar una lista de caracteres, se puede usar translate método de la cadena:

import string 
name = "Barack (of Washington)" 
table = string.maketrans('', '',) 
print name.translate(table,"(){}<>") 
# Barack of Washington 
45

Porque eso no es lo que hace strip(). Elimina los caracteres iniciales y finales que están presentes en el argumento, pero no los caracteres en el medio de la cadena.

Se podría hacer:

name= name.replace('(', '').replace(')', '').replace ... 

o:

name= ''.join(c for c in name if c not in '(){}<>') 

o tal vez usar una expresión regular:

import re 
name= re.sub('[(){}<>]', '', name) 
8

Debido strip() solamente tiras finales e iniciales caracteres, basado en lo que previsto. Sugiero:

>>> import re 
>>> name = "Barack (of Washington)" 
>>> name = re.sub('[\(\)\{\}<>]', '', name) 
>>> print(name) 
Barack of Washington 
+2

En una clase de caracteres regex no necesita escapar nada, por lo que '[() {} <>] está bien –

15

string.translate con mesa = Nada funciona bien.

>>> name = "Barack (of Washington)" 
>>> name = name.translate(None, "(){}<>") 
>>> print name 
Barack of Washington 
+0

Esto no funciona en Python 3 para cadenas, solo para bytes y bytearray. –

-2

Por ejemplo cadena s="(U+007c)"

Para eliminar sólo los paréntesis de s, pruebe los siguientes uno:

import re 
a=re.sub("\\(","",s) 
b=re.sub("\\)","",a) 
print(b) 
+0

¿Cómo elimina eso el paréntesis? ¿Al eliminar todo lo que no es alfanumérico? –

+0

Cuando la pregunta dice "eliminar paréntesis" pero su respuesta dice "eliminar todo lo que no sea alfanumérico", no creo que esté respondiendo la pregunta. –

Cuestiones relacionadas