Python - 函数lstrip的一个非常奇怪的行为

时间:2016-03-10 17:18:37

标签: python

我遇到了内置函数lstrip非常奇怪的行为。

我将用几个例子来解释:

print 'BT_NAME_PREFIX=MUV'.lstrip('BT_NAME_PREFIX=') # UV
print 'BT_NAME_PREFIX=NUV'.lstrip('BT_NAME_PREFIX=') # UV
print 'BT_NAME_PREFIX=PUV'.lstrip('BT_NAME_PREFIX=') # UV
print 'BT_NAME_PREFIX=SUV'.lstrip('BT_NAME_PREFIX=') # SUV
print 'BT_NAME_PREFIX=mUV'.lstrip('BT_NAME_PREFIX=') # mUV

如您所见,该功能修剪了一个额外的字符有时

我试图对问题进行建模,并注意到如果我:

它会持续存在
  • BT_NAME_PREFIX更改为BT_NAME_PREFIY
  • BT_NAME_PREFIX更改为BT_NAME_PREFIZ
  • BT_NAME_PREFIX更改为BT_NAME_PREF

进一步的尝试使其更加奇怪

print 'BT_NAME=MUV'.lstrip('BT_NAME=') # UV
print 'BT_NAME=NUV'.lstrip('BT_NAME=') # UV
print 'BT_NAME=PUV'.lstrip('BT_NAME=') # PUV - different than before!!!
print 'BT_NAME=SUV'.lstrip('BT_NAME=') # SUV
print 'BT_NAME=mUV'.lstrip('BT_NAME=') # mUV

有人可以解释一下这里到底发生了什么吗?

我知道我不妨使用数组切片,但我仍然想了解这一点。

由于

2 个答案:

答案 0 :(得分:3)

你误解了lstrip的工作原理。它将你传入的角色视为一个袋子,然后剥离袋子里的角色,直到它找到一个不在袋子里的角色。

考虑:

'abc'.lstrip('ba')  # 'c'

从字符串的开头删除子字符串。要做到这一点,你需要像:

if s.startswith(prefix):
    s = s[len(prefix):]

e.g:

>>> s = 'foobar'
>>> prefix = 'foo'
>>> if s.startswith(prefix):
...     s = s[len(prefix):]
... 
>>> s
'bar'

或者,我想你可以使用正则表达式:

>>> s = 'foobar'
>>> import re
>>> re.sub('^foo', '', s)
'bar'

答案 1 :(得分:1)

赋予lstrip的参数是从字符串左侧删除的事物列表,逐个字符。不考虑这个短语,只考虑字符本身。

  

S.lstrip([chars]) - >字符串或unicode

     

返回字符串S的副本,删除前导空格。如果   给出字符而不是无,删除字符中的字符。如果   chars是unicode,S将在剥离之前转换为unicode

您可以使用正则表达式(re模块)以灵活的方式解决此问题:

>>> import re
>>> re.sub('^BT_NAME_PREFIX=', '', 'BT_NAME_PREFIX=MUV')
MUV