Почему str.lstrip накладывает дополнительный символ?

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'
>>> 

Я ожидаю, что вывод path.lstrip('/Volumes') должен быть /Users

Ответ 1

lstrip основан на символах, он удаляет все символы из левого конца, которые находятся в этой строке.

Чтобы проверить это, попробуйте следующее:

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

Так как/является частью строки, она удаляется.

Я подозреваю, что вам нужно использовать нарезку:

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

но, надеюсь, кто-то с более глубоким знанием библиотеки Python может дать вам лучший вариант.

Ответ 2

Полоса основана на символах. Если вы пытаетесь выполнить манипуляции с курсом, вы должны взглянуть на os.path

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

Ответ 3

Аргумент, переданный в lstrip, берется как набор символов!

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

См. также документацию

Возможно, вы захотите использовать str.replace()

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

Возвращает копию строки со всеми вхождениями подстроки old, замененной на новую. Если задан параметр необязательного аргумента, заменяются только первые экземпляры счетчика.

Для путей вы можете использовать os.path.split(). Он возвращает список элементов пути.

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

К вашей проблеме:

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

В приведенном выше примере показано, как работает lstrip(). Он удаляет пустую форму '/vol' слева. Затем начинается снова... Итак, в вашем примере он полностью удалил '/Volumes' и начал удаление '/'. Он удалил только "/", поскольку после этой косой черты не было "V".

НТН

Ответ 4

lstrip doc говорит:

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

Итак, вы удаляете каждый символ, содержащийся в данной строке, включая символы "s" и "/".

Ответ 5

Вот примитивная версия lstrip (которую я написал), которая может помочь вам разобраться:

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)

Таким образом, вы можете видеть, что каждое появление символа в символах удаляется до тех пор, пока не встретится символ, который не находится в символах. Как только это произойдет, удаление прекратится, и остальная часть строки будет просто возвращена.