¿Por qué str.lstrip elimina un carácter extra?

Python 2.6 (trunk:66714:66715M, Oct 1 2008, 18:36:04) [GCC 4.0.1 (Apple Computer, Inc. build 5370)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> path = "/Volumes/Users" >>> path.lstrip('/Volume') 's/Users' >>> path.lstrip('/Volumes') 'Users' >>> 

Estoy esperando que la salida de path.lstrip('/Volumes') sea /Users

lstrip está basado en caracteres, elimina todos los caracteres del extremo izquierdo que están en esa cadena.

Para verificar esto, intente esto:

 "/Volumes/Users".lstrip("semuloV/") 

Dado que / es parte de la cadena, se elimina.

Sospecho que necesitas usar rebanar en su lugar:

 if s.startsWith("/Volumes"): s = s[8:] 

pero es de esperar que alguien con un conocimiento más íntimo de la biblioteca de Python pueda ofrecerle una mejor opción.

La tira es basada en el carácter. Si está intentando realizar una manipulación de rutas, debería echar un vistazo a os.path

 >>> os.path.split("/Volumes/Users") ('/Volumes', 'Users') 

El argumento pasado a lstrip se toma como un conjunto de caracteres!

 >>> ' spacious '.lstrip() 'spacious ' >>> 'www.example.com'.lstrip('cmowz.') 'example.com' 

Véase también la documentación.

Es posible que desee utilizar str.replace ()

 str.replace(old, new[, count]) # eg '/Volumes/Home'.replace('/Volumes', '' ,1) 

Devuelva una copia de la cadena con todas las apariciones de subcadenas antiguas reemplazadas por nuevas. Si se da el recuento de argumentos opcional, solo se reemplazan las primeras ocurrencias de recuento.

Para las rutas, es posible que desee utilizar os.path.split() . Devuelve una lista de los elementos de caminos.

 >>> os.path.split('/home/user') ('/home', '/user') 

A tu problema:

 >>> path = "/vol/volume" >>> path.lstrip('/vol') 'ume' 

El ejemplo anterior muestra cómo funciona lstrip() . Elimina ‘/ vol’ de la forma de inicio a la izquierda. Luego, comienza de nuevo … Entonces, en su ejemplo, eliminó completamente ‘/ Volumes’ y comenzó a eliminar ‘/’. Solo se eliminó la ‘/’ ya que no había ‘V’ después de esta barra.

HTH

lstrip doc dice:

 Return a copy of the string S with leading whitespace removed. If chars is given and not None, remove characters in chars instead. If chars is unicode, S will be converted to unicode before stripping 

Por lo tanto, está eliminando todos los caracteres que están contenidos en la cadena dada, incluidos los caracteres ‘s’ y ‘/’.

Aquí hay una versión primitiva de lstrip (que escribí) que podría ayudar a aclarar las cosas para usted:

 def lstrip(s, chars): for i in range len(s): char = s[i] if not char in chars: return s[i:] else: return lstrip(s[i:], chars) 

Por lo tanto, puede ver que cada aparición de un carácter en caracteres se elimina hasta que se encuentra un carácter que no está en caracteres. Una vez que eso sucede, la eliminación se detiene y el rest de la cadena simplemente se devuelve