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?
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.9
puedes usarremoveprefix
. 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 permite10:
permanecer intacto junto con5: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
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.
En Python 3.9+, use
str.removeprefix
– Boris Verjovskiy
27 de abril de 2020 a las 15:48
Características útiles para
removeprefix()
yremovesuffix()
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