En uno de mis proyectos me llamó la atención el siguiente escenario:

word = 'mixed4d_pre_relu'
word.strip('_pre_relu')
Out[5]: 'mixed4d'

La salida aquí es como se esperaba.

Sin embargo, cuando hago lo siguiente:

word = 'mixed4e_pre_relu'
word.strip('_pre_relu')
Out[5]: 'mixed4'  # No 'e' here, yyy?

Como puede ver, eso es realmente extraño.

¿Alguien tiene una idea de cuál sería la causa de un comportamiento tan extraño?

Editar: Gracias por la breve aclaración. No sé por qué supuse que strip() sirve para eliminar cadenas de concreto.

1
bmiselis 25 feb. 2020 a las 16:08

2 respuestas

La mejor respuesta

Según los comentarios, .strip() toma una lista de caracteres y los despoja a todos, no una cadena para despojar en particular. Lo hará en los extremos de la cadena, moviéndose hacia adentro hasta que encuentre algo que no sea parte de ese conjunto de caracteres, en cuyo punto se detendrá.

Una alternativa que hará lo que desee (al menos en este caso) es el reemplazo de expresiones regulares:

>>> import re
>>> re.sub(r'_pre_relu$', '', word)
'mixed4d'

Esto simplemente busca el texto _pre_relu al final de la cadena, sirviendo así como rstrip(). El reemplazo lstrip() equivalente sería r'^_pre_relu', que eliminaría ese texto al comienzo de la cadena.

4
Green Cloak Guy 25 feb. 2020 a las 13:15

Esto no es extraño Es según la funcionalidad dada de str.strip ('chars'). Incluso word.rstrip('luerp_') dará el mismo resultado ya que intenta eliminar todos los caracteres proporcionados como argumento de word hasta que encuentre una falta de coincidencia que sea 4 en su caso.

0
Tarique 25 feb. 2020 a las 13:20