剥离意外删除'_'

Dyl*_* Su 3 python strip

>>> x = 'abc_cde_fgh'
>>> x.strip('abc_cde')
'fgh'
Run Code Online (Sandbox Code Playgroud)

_fgh 是期待.

如何理解这个结果?

Ale*_*agh 7

Strip从子字符串中删除从任一端找到的任何字符:它不会删除尾随或前导字.

这个例子很好地证明了这一点:

x.strip('ab_ch')
'de_fg'
Run Code Online (Sandbox Code Playgroud)

由于字符"a","b","c","h"和"_"在删除情况下,所以前导"abc_c"都被删除.其他字符不会被删除.

如果你想删除一个前导或尾随单词,我建议使用restartswith/endswith.

def rstrip_word(str, word):
    if str.endswith(word):
        return str[:-len(word)]
    return str

def lstrip_word(str, word):
    if str.startswith(word):
        return str[len(word):]
    return str

def strip_word(str, word):
    return rstrip_word(lstrip_word(str, word), word)
Run Code Online (Sandbox Code Playgroud)

删除多个单词

从字符串中删除多个单词的一个非常简单的实现(贪婪的)可以按如下方式完成:

def rstrip_word(str, *words):
    for word in words:
        if str.endswith(word):
            return str[:-len(word)]
    return str

def lstrip_word(str, *words):
    for word in words:
        if str.startswith(word):
            return str[len(word):]
    return str

def strip_word(str, *words):
    return rstrip_word(lstrip_word(str, *words), *words)
Run Code Online (Sandbox Code Playgroud)

请注意这个算法是贪婪的,它会找到第一个可能的例子,然后返回:它可能没有你想象的那样.找到最大长度匹配(虽然不是太棘手)更多涉及.

>>> strip_word(x, "abc", "adc_")
'_cde_fgh'
Run Code Online (Sandbox Code Playgroud)

  • 我误解了条带的含义.我试图剥掉一个`word`,这不是什么条带.谢谢. (2认同)