去除下划线时出现意外情况

4
>>> x = 'abc_cde_fgh'
>>> x.strip('abc_cde')
'fgh'

期望出现 _fgh

如何理解这个结果?

3个回答

8

Strip函数用于从子字符串的两端删除任何字符:它不会删除尾随或前导单词。

以下示例很好地演示了这一点:

x.strip('ab_ch')
'de_fg'

由于字母"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)

删除多个单词

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

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)

请注意,该算法是 贪心 算法,它会找到第一个可能的例子然后返回结果:它可能不像你期望的那样表现。寻找最大长度匹配(虽然不太复杂)需要更多的工作量。
>>> strip_word(x, "abc", "adc_")
'_cde_fgh'

2
我误解了strip的含义。我尝试去strip一个word,但这不是strip的作用。谢谢。 - Dylan Su
1
@DylanSu,我在那种情况下包含了去除单个单词的实现。如果需要,可以通过接受参数列表将其扩展到一般情况。 - Alex Huszagh

1

strip()函数会移除字符,并非子字符串。例如:

x.strip('abcde_')
'fgh'

0
在strip方法的文档中,“chars参数是一个字符串,指定要删除的字符集。”这就是为什么除了“fgh”之外的所有字符都被删除(包括两个下划线)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接