为什么 .rstrip() 有时候有效有时候无效?

3
我是一名初学者,刚开始学习Python。我已经阅读了rstrip的文档和这里的一些其他问题,但仍然对rstrip的实际工作原理感到困惑。
我可以理解字符串.rstrip()的工作原理,如:
INPUT:      '   spacious   '.rstrip()
OUTPUT:     '   spacious'

请注意以下内容:

INPUT:      "ABBA".rstrip("AB") 
OUTPUT:     ''

但是以下内容可能会让你感到困惑:

INPUT:     "AABAA".rstrip("A")
OUTPUT:    'AAB'

这个问题是为什么它的输出是AAB而不是B?因为我觉得字符串开头的AA和结尾的AA都是由A组成的组合。

还有这个:

  INPUT:     "ABCABBA".rstrip("AB")
  OUTPUT:    'ABC'

这个问题的原因是为什么它的输出不是C?我的想法是在开头AB,中间AB和结尾BA都应该被剥离。

感谢您抽出时间来回答我的问题!


3
你明白' spacious '.rstrip()的意思,但不理解'ABC'吗?你认为这个名称中的 r 代表什么?文档中是否有令人困惑的地方? - Mad Physicist
1
我本以为这是许多人没有意识到参数是要剥离的字符集,而不是要删除的后缀(如果存在的话)之一,但这真是个惊喜。 - user2357112
1
谢谢您的回复,@MadPhysicist :)!我现在明白了。r代表右侧,因此它是一种从字符串“右侧”删除字符的方法。一旦它遇到不在您给出的字符组合中的字符(例如:ABCABBA中的C),它就会停止。因此输出为ABC而不是C。这个逻辑正确吗? - Cloudy_Green
1
@Cloudy_Green。太棒了! - Mad Physicist
2个回答

5

让我们从你已经了解的开始,引领你进入未知的领域。

INPUT:      '   spacious   '.rstrip()
OUTPUT:     '   spacious'

这里的 rstrip() 函数将你的字符串作为输入,并从末尾删除所有不需要的字符。(rstripstrip 不同,因为 rstrip 是反向的 - 它从后面开始。)在这种情况下,你没有传递任何表示要删除的内容的字符串,所以它默认删除 "所有空格"。因此,它从字符串的末尾开始,删除所有空格。它一遇到非空白字符就停止,这就是为什么结果是 ' spacious'

接下来,这里发生了什么?

INPUT:     "AABAA".rstrip("A")
OUTPUT:    'AAB'

在这里,你正在向rstrip传入一个参数。该字符串是要剥离的所有内容的列表。在这种情况下,““A””告诉它仅从后面的字符串中剥离字母A。与前面的例子类似,rstrip会停止在遇到不需要删除的字符时。因此,它会在“B”处停止,就像先前的rstrip停在最右边的字母s上。
这应该能让最终的示例变得更加容易理解。
INPUT:     "ABCABBA".rstrip("AB")
OUTPUT:    'ABC'

你正在告诉rstrip从字符串中删除任何尾随的AB。因此,它确实这样做,并且停在您不删除的第一个字符处,在这种情况下是C。通常,一旦它停止,它会将左侧的所有内容保留原样。

1
“rstrip 在遇到不需要删除的字符时会立即停止” 值得强调。 - OverLordGoldDragon
非常感谢@Scott Mermelstein提供如此详细的逐步解释! :) 我真的很感激!这正是我遇到和挣扎的问题。在阅读了您的帖子之后,我的逻辑现在非常清晰 - 这非常有帮助!我知道这个问题对于新手来说确实很菜,我确实做了很多搜索,但仍然无法弄清楚原因。再次感谢您抽出时间回答我的问题!祝您周末愉快! :) - Cloudy_Green
1
@Cloudy_Green 当然没问题 - 学习“为什么”事情会做什么是一个好的实践。继续学习吧。 - OverLordGoldDragon

2

补充Scott的回答,关键在于这里:rstrip(CHARS) 会在遇到不在CHARS中的字符时停止。以下是一些示例以更好地说明;假设txt = "banana,,,ssqqqww..."。那么,

print(txt.rstrip(",.qsw")) # 'r' for 'reverse'
# banana

print(txt.rstrip("qws.,")) # ORDER doesn't matter
# banana

print(txt.rstrip("A,.qsw")) # txt is compared against CHAR, not CHAR against txt
# banana

print(txt.rstrip("a,.qsw")) # stops at 'n', doesn't proceed to other 'a's
# banan

1
我认为“r”代表“right”,以补充lstrip中的“left”。除非那个“l”代表“leading”或其他令人惊讶的东西... - SethMMorton

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