我遇到了内置函数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
有人可以解释一下这里到底发生了什么吗?
我知道我不妨使用数组切片,但我仍然想了解这一点。
由于
答案 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