Eliminar un prefijo de una cadena [duplicate]

4 minutos de lectura

Estoy tratando de hacer lo siguiente, de una manera pitónica clara:

def remove_prefix(str, prefix):
    return str.lstrip(prefix)

print remove_prefix('template.extensions', 'template.')

Esto da:

xtensions

Que no es lo que esperaba (extensions). Obviamente (estúpido de mí), porque he usado lstrip incorrectamente: lstrip eliminará todos los caracteres que aparecen en el pasado chars cadena, sin considerar esa cadena como una cadena real, sino como “un conjunto de caracteres para eliminar del principio de la cadena”.

¿Existe una forma estándar de eliminar una subcadena desde el principio de una cadena?

  • En Python 3.9+, use str.removeprefix

    – Boris Verjovskiy

    27 de abril de 2020 a las 15:48

  • Características útiles para removeprefix() y removesuffix() en el recién lanzado Python 3.9.

    – Milovan Tomašević

    17 oct 2020 a las 9:55

  • Una línea de la respuesta de @martineau: remove_prefix = lambda text, prefix: text[len(prefix):] if text.startswith(prefix) else text

    – Basj

    29 abr a las 16:47


avatar de usuario
elazar

No sé acerca de la “forma estándar”.

def remove_prefix(text, prefix):
    if text.startswith(prefix):
        return text[len(prefix):]
    return text  # or whatever

Como señalaron @Boris y @Stefan, en Python 3.9+ puede usar

text.removeprefix(prefix)

con el mismo comportamiento.

  • A partir de Python 3.9puedes usar removeprefix. Para ver un ejemplo, vea esta respuesta.

    – Stefan

    27 de mayo de 2020 a las 18:53


  • ¡Enfriar! Nota: el comportamiento de la nueva función es exactamente como en esta respuesta (devolviendo la cadena sin cambios si no comienza con prefix)

    – Elazar

    27 mayo 2020 a las 23:50


  • Esto es perfecto para recortar hh:mm:ss ceros a la izquierda sin dañar los ceros significativos. Reemplacé al líder '0:' y entonces '0' a nulo Esto permite 10: permanecer intacto junto con 5:08.

    – WinEunuuchs2Unix

    18 de octubre de 2020 a las 2:19


  • removeprefix – mejor tarde que nunca.

    – martineau

    24 de febrero de 2021 a las 21:40


Corto y dulce:

def remove_prefix(text, prefix):
    return text[text.startswith(prefix) and len(prefix):]

  • @jamylak es como el “ternario” y/o, pero correcto 🙂 … +1, aunque creo que es demasiado inteligente para el código real. Y no puede decidir si desea que genere una excepción de lo contrario.

    – Elazar

    3 de junio de 2013 a las 9:15


  • Bueno, definitivamente tienes que pensar mucho más cuando revisas un código como este en comparación con la respuesta aceptada, incluso si trabajas con Python con más frecuencia.

    – Tomás

    13 de agosto de 2020 a las 14:37


  • Votado negativo. Este es el tipo de material inteligente e innecesario que hace que leer incluso MI PROPIO CÓDIGO sea más difícil.

    – Señor R

    20 de diciembre de 2020 a las 2:18


  • @MrR: Python también tiene otra característica, frecuentemente infrautilizada: comentarios.

    – martineau

    20 de diciembre de 2020 a las 5:33

  • Los comentarios corren el riesgo de separarse del código al que se refieren, por lo que están lejos de ser una panacea para la clarificación del código. Prefiero mucho más el código que es autocomentario.

    – Señor R

    27 de diciembre de 2020 a las 4:43


¿Qué pasa con esto (un poco tarde):

def remove_prefix(s, prefix):
    return s[len(prefix):] if s.startswith(prefix) else s

  • +1 Conciso. Pero, ¿puedes hacer que aumente algo en el caso de error y aún así encajarlo en 2 líneas x 80 columnas?

    – nube_personal

    22 de septiembre de 2017 a las 23:26

  • @personal_nube: return s[s[:len(prefix)].index(prefix) + len(prefix):]

    – William Pursell

    21 de diciembre de 2017 a las 19:21

Creo que puedes usar métodos de la str escriba para hacer esto. No hay necesidad de expresiones regulares:

def remove_prefix(text, prefix):
    if text.startswith(prefix): # only modify the text if it starts with the prefix
         text = text.replace(prefix, "", 1) # remove one instance of prefix
    return text

avatar de usuario
jamilak

solución de expresiones regulares (La mejor manera es la solución de @Elazar, esto es solo por diversión)

import re
def remove_prefix(text, prefix):
    return re.sub(r'^{0}'.format(re.escape(prefix)), '', text)

>>> print remove_prefix('template.extensions', 'template.')
extensions

def remove_prefix(str, prefix):
    if str.startswith(prefix):
        return str[len(prefix):]
    else:
        return str

Como nota al margen, str es un mal nombre para una variable porque sombrea el str escribe.

¿Ha sido útil esta solución?