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
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
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.
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
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)
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
En una clase de caracteres regex no necesita escapar nada, por lo que '[() {} <>] está bien –
string.translate con mesa = Nada funciona bien.
>>> name = "Barack (of Washington)"
>>> name = name.translate(None, "(){}<>")
>>> print name
Barack of Washington
Esto no funciona en Python 3 para cadenas, solo para bytes y bytearray. –
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)
¿Cómo elimina eso el paréntesis? ¿Al eliminar todo lo que no es alfanumérico? –
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. –
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
no funcionará para unicode: translate() solo toma un argumento (tabla) con unicode. – rikAtee
menos 1: Para hacer algo acerca de la velocidad, que debería ser sobre la claridad y robustez del código. – jwg