为什么str.lstrip会删除一个额外的字符?

时间:2009-11-06 12:05:30

标签: python string

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

5 个答案:

答案 0 :(得分:24)

lstrip是基于字符的,它会删除该字符串中左端的所有字符。

要验证这一点,请尝试以下操作:

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

由于/是字符串的一部分,因此将其删除。

我怀疑你需要使用切片:

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

但希望对Python库有更深入了解的人可能会给你一个更好的选择。

答案 1 :(得分:17)

Strip是基于字符的。如果您尝试进行路径操作,则应该查看os.path

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

答案 2 :(得分:14)

传递给lstrip的参数被视为一组字符!

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

另请参阅documentation

您可能想要使用str.replace()

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

返回字符串的副本,其中所有出现的substring old都替换为new。如果给出了可选参数计数,则仅替换第一次计数出现次数。

对于路径,您可能需要使用os.path.split()。它返回路径元素的列表。

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

解决您的问题:

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

上面的示例显示了lstrip()的工作原理。它从左边开始删除'/ vol'。然后,再次开始...... 因此,在您的示例中,它完全删除了“/ Volumes”并开始删除“/”。它只删除了'/',因为此斜杠后面没有'V'。

HTH

答案 3 :(得分:1)

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'和'/'字符。

答案 4 :(得分:0)

这是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)

因此,您可以看到chars中每个字符的出现都被删除,直到遇到不在字符中的字符。一旦发生这种情况,删除就会停止,只返回字符串的其余部分