2012-05-14 14 views
15

¿Hay una manera pitonica de hacer lo que hace el método str.strip(), excepto todas las ocurrencias, no solo las que están al principio y al final de una cadena?Eliminar todas las apariciones de varios caracteres de una cadena

Ejemplo:

>> '::2012-05-14 18:10:20.856000::'.strip(' -.:') 
>> '2012-05-14 18:10:20.856000' 

Quiero

>> '::2012-05-14 18:10:20.856000::'.crazy_function(' -.:') 
>> '20120514181020856000' 

¿El Python proporciona un built-in crazy_function ???

Podría hacerlo fácilmente por programación, pero quiero saber si hay un built-in para eso. No se pudo encontrar uno. Gracias por tu ayuda.

Respuesta

21

utilizar la función translate para borrar los caracteres no deseados:

>>> '::2012-05-14 18:10:20.856000::'.translate(None, ' -.:') 
'20120514181020856000' 

Asegúrese de que su cadena es de str tipo y no unicode, ya que los parámetros de la función no serán los mismos. Para unicode, use la siguiente sintaxis; que consiste en la construcción de la dict de los ordinales Unicode de los caracteres para borrar y para asignarlos a None:

>>> u'::2012-05-14 18:10:20.856000::'.translate({ord(k):None for k in u' -.:'}) 
u'20120514181020856000' 

Algunos instantes para la comparación de rendimiento con re:

>>> timeit.timeit("""re.sub(r"[ -.:]", r"", "'::2012-05-14 18:10:20.856000::'")""","import re") 
7.352270301875713 
>>> timeit.timeit("""'::2012-05-14 18:10:20.856000::'.translate(None, ' -.:')""") 
0.5894893344550951 
+0

yo prefiero una solución incorporada como éste sobre la solución escrita por Nick Craig-Wood. Pero me pregunto: en términos de rendimiento, ¿qué hay mejor? Podría estar equivocado, pero esta función de 'traducir' probablemente hace uso de la funcionalidad de expresiones regulares. – Francisco

+0

@Francisco: supongo que en realidad hay dos funciones de traducción diferentes. La versión 3-Arugment funciona con _byte sequences_, usa una tabla de traducción, que se ilumina rápidamente. La versión Unicode funciona en _strings_, reemplaza los caracteres uno por uno y en realidad es tan lenta como la expresión regular si no más lenta. Todavía usaría expresiones regulares para su problema, porque mezclar _strings_ y _byte sequences_ nunca es una buena idea, incluso en python2. – georg

+0

@ thg435: En mi problema, específicamente, la versión de bytes está bien. Estoy creando códigos de identificación basados ​​en str (datetime.datetime.now()) y agregando un pedazo adicional de cadena a él. Entonces, Unicode no es un problema para mí. – Francisco

4

que podría hacerlo con bastante facilidad con re.sub

>>> import re 
>>> re.sub(r"[ -.:]", r"", "'::2012-05-14 18:10:20.856000::'") 
'20120514181020856000' 
>>> 
1

No. no creo que hay una construida en.

lo haría así:

>>> s = '::2012-05-14 18:10:20.856000::' 
>>> 
>>> ''.join(x for x in s if x not in ' -.:') 
'20120514181020856000' 
>>> 
+1

Doh. traducir. Por supuesto. – cdjc

+0

Gracias, pero eso es "programáticamente". – Francisco

+0

Mira la otra respuesta que usa translate –

Cuestiones relacionadas