Python的strip函数

3
在Python中,当我尝试这样做时:-
ac = "Pearl Riverb-Vaccines"
b = ac.strip("-Vaccines")
b = b.strip()
print(b)

输出结果为:珠江 但是当我尝试这样做时:
ac = "Pearl Rivera-Vaccines"
b = ac.strip("-Vaccines")
b = b.strip()
print(b)

输出为:- 珠江

那么第二行代码为什么缺少字母“a”? 我尝试了其他每个字母,它们都可以被打印出来,但是字母“a”的问题是什么?

2个回答

6

strip()在删除字符串末尾的字符时不考虑计数或顺序。您传递给它的参数"-Vaccines"中包含一个"a",因此它将从"Rivera"中删除"a"。它已经从"Vaccines"中删除了一个"a",并且它不在V和c之间也无所谓。

请考虑另一个例子:

>>> "abcXqrqqqrrrqrqrqrqrqqrr".strip("qr")
'abcX'

这里移除了许多qr,尽管strip的参数仅包含每个字符各一个。

一般来说,strip不适用于从字符串末尾移除静态数量的字符。一种可能的替代方案是使用正则表达式,它可以匹配出现在字符串末尾的字面字符序列:

>>> import re
>>> ac = "Pearl Rivera-Vaccines"
>>> re.sub("-Vaccines$", "", ac)
'Pearl Rivera'

在他的回答中,汤姆·卡尔泽斯指出,这种方法无法轻松地处理包含正则表达式中具有特殊含义的字符的字符串。例如,

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

^在正则表达式中有特殊含义,因此模式"^bar$"无法匹配字符串s的结尾。如果要匹配包含特殊字符的字符串,应该进行转义,可以手动转义或使用re.escape函数。

>>> import re
>>> s = "foo^bar"
>>> re.sub(r"\^bar$", "", s)
'foo'
>>> re.sub(re.escape("^bar") + "$", "", s)
'foo'

嗨,Kevin,感谢您的解释和提供的解决方案,但为什么“Pearl”中的“a”没有被移除? - Sandeep Varma
因为strip仅删除尾随字符 @SandeepVarma 参见此处 - yatu

2
问题在于对于strip的参数使用方式与你想象中不同。该参数并不被视为一系列字符,而是一组字符。任何在参数字符串中的字符都会被删除。例如:最初的回答。
"abaca".strip("ac")

生成:

'b'

由于所有"a""b"的实例都已被移除。

如果你只想从一个字符串中删除后缀,你可以这样做:

Original Answer翻译成"最初的回答"

ac = "Pearl Rivera-Vaccines"
s = "-Vaccines"
b = ac
if b.endswith(s):
    b = b[:-len(s)]

这将导致b的值为:最初的回答
'Pearl Rivera'

请注意,这种方法比使用“re”模块更快。它也更加灵活,因为它可以处理任何非空字符串(而创建正则表达式将需要转义某些字符)。"最初的回答"

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