Python strip/lstrip传入字符串参数返回异常结果问题咨询
现象原因说明
该现象和制表符转义没有任何关系,核心是对strip系列方法的参数定义理解有误。
Python官方对str.lstrip([chars])、str.rstrip([chars])、str.strip([chars])的参数定义为:可选参数chars是需要被移除的字符集合,而非需要匹配的完整前缀/后缀字符串。
方法的底层运行逻辑为:
lstrip从字符串最左侧开始遍历,只要当前字符属于chars指定的集合,就移除该字符,直到遇到第一个不在chars里的字符停止rstrip逻辑相同,只是从字符串最右侧开始遍历strip同时从左右两侧按照上述规则移除字符
你的测试用例拆解
第一个测试用例
你传入的b="/get/"对应的字符集合为{'/', 'g', 'e', 't'},遍历a="/get/todo.dat"的过程如下:
- 依次移除左侧的
/、g、e、t、/后,下一个字符是t(对应todo的首字母) - 由于
t属于chars集合,也会被移除,最终得到结果odo.dat
第二个测试用例
你传入的mask='data/rwl3_v001_Data'包含字符0、1、a、t等:
- 执行
lstrip时,移除完前缀匹配的字符后,后续的0、0、1都属于mask的字符集合,会被连续移除,最终剩下8.dat - 执行
strip时,右侧的d、a、t也属于mask的字符集合,会被从右侧移除,最终剩下8.
使用strip系列方法的注意规则
- 不要将
chars参数当做完整匹配的前缀/后缀使用,所有出现在chars里的字符都会被无顺序匹配移除 - 如果你需要实现完整前缀匹配移除的需求:
- Python 3.9及以上版本可直接使用官方提供的
str.removeprefix()、str.removesuffix()方法,完全符合你的预期,例如a.removeprefix(b)会直接返回todo.dat - 低于3.9版本可自行实现对应逻辑,代码示例:
- Python 3.9及以上版本可直接使用官方提供的
def remove_prefix(s: str, prefix: str) -> str: return s[len(prefix):] if s.startswith(prefix) else s def remove_suffix(s: str, suffix: str) -> str: return s[:-len(suffix)] if s.endswith(suffix) else s
内容的提问来源于stack exchange,提问作者peets
相关产品推荐
相关产品推荐

