Eliminar un prefijo de una cadena

Estoy tratando de hacer lo siguiente, de una manera clara y pythonica:

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), porque he usado lstrip incorrectamente: lstrip eliminará todos los caracteres que aparecen en la cadena de chars pasados, no considerando esa cadena como una cadena real, sino como “un conjunto de caracteres para eliminar desde el principio de la cadena “.

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

No sé de “forma estándar”.

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

Corto y dulce:

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

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

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

Creo que puedes usar métodos del tipo str 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 

solución de expresiones regulares (la mejor manera es la solución de @Elazar, 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 aparte, str es un mal nombre para una variable porque oculta el tipo de str .