首先請(qǐng)大家來(lái)看一下這行代碼:
print("tmp-temp-test-pmt".strip(".tmp"))
你覺(jué)得輸出的結(jié)果是什么?
我覺(jué)得大部分同學(xué)肯定會(huì)毫不猶豫的說(shuō)答案是: -temp-test-pmt
,相信大多數(shù)人都會(huì)覺(jué)得這個(gè)是沒(méi)有問(wèn)題的欺劳,然而事實(shí)情況卻不是這樣的枝哄,正確答案是:
-temp-test-
哈哈哈娱两,奇怪吧街图,包括我最開始也很納悶浇衬,還以為和python的版本有關(guān)系,或者說(shuō)是一個(gè)BUG台夺,但是其實(shí)結(jié)果卻不是径玖。
至于為什么是-temp-test-
呢痴脾?我們來(lái)看一下strip函數(shù)的說(shuō)明吧:
S.strip([chars]) -> string or unicode
Return a copy of the string S with leading and trailing
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
結(jié)果很明顯颤介,一切盡在不言中。通過(guò)文檔我們可以知道strip
函數(shù)的特點(diǎn):
如果未指定 chars 參數(shù)或參數(shù)值未 None, 去除字符串 首尾空白符(空格赞赖、換行符等等)
否則滚朵,只要 首尾字符包含在 chars 定義的字符串內(nèi) ,就會(huì)被去除前域。并且會(huì)遞歸調(diào)用直到首尾字符不在 chars 內(nèi)辕近。類似:
def _strip(s, chars):
if s[0] in chars:
return _strip(s[1:], chars)
elif s[-1] in chars:
return _strip(s[:-1], chars)
else:
return s
此外更多的例子還有:
>>> '18349-13-3434'.strip('0123456789')
'-13-'
>>> '18349-13-3434'.strip('123')
'8349-13-3434'
>>> 'scene_scdefg'.strip('scene_')
'defg'
>>> '\r \t\n '.strip()
''
現(xiàn)在我們知道 str.strip 是按 字符 進(jìn)行移除操作的。 那么如何按字符串進(jìn)行移除呢匿垄?
一種解決辦法就是使用 re.sub:
def strip2(s, chars):
re_chars = re.escape(chars)
s = re.sub(r'^(?:%s)+(?P<right>.*)$' % re_chars, '\g<right>', s)
s = re.sub(r'^(?P<left>.*?)(?:%s)+$' % re_chars, '\g<left>', s)
return s
>>> print(strip2('12345-abc-12345-defg-54321', '12345'))
-abc-12345-defg-54321