1.说明Python的string变量自带的strip()方法可以用来删除字符串首尾的空格,也可以用来删除字符串开头和结尾的空格。琴弦用起来感觉很好。就这样一直在用,还没发现什么问题。今天使用strip()方法修复了一个bug,但是并没有像预期的那样消除bug。首先,毫无疑问,strip()删除子串有什么问题。二是代码比较长。第三,依赖于底层库,不是很可靠。排查了半天,终于发现是对strip()的用途误解造成的,损失惨重。2、删除子串的错误操作示例1错误的strip()操作假设我们有如下字符串,我们通过rstrip()删除末尾的“str”子串没有问题,但是通过rstrip()删除尾部当#examplestringtest_str的“_str”子串="this_is_a_test_str"#expectedtoremovethetrailing"str",结果如预期的那样#expectedtobe"this_is_a_test_",theresultisalso"this_is_a_test_"test_str.rstrip("str")#期望删除尾随的"_str",结果不符合预期。#期望是“this_is_a_test”,但实际上是“this_is_a_te”test_str.rstrip("_str")2strip()的原理表明,出现上述意想不到的情况是因为根本没有使用strip()进行删除“给定的字符串”,但用于删除给定的字符集,直到遇到不在字符集中的字符。在test_str.rstrip("str")中,字符集为"s"、"t"、"r",按照rstrip()的指令从右往左删除字符串。当删除完成"str",遇到"_","_"不在字符集中,所以停止删除,所以得到的结果是this_is_a_test_;和删除“str”字符串的结果是一致的,但这只是巧合。在test_str.rstrip("_str")中,字符集为“_”、“s”、“t”、“r”四个字符,按照rstrip()的指令从右往左删除字符串。删除“_str”后,后面的“t”和“s”还在字符集中所以还是删除了,所以结果是this_is_a_te,不是this_is_a_test。3一个典型的字符串截断错误【可略过】#例子stringtest_str="this_is_a_test_str"#下面的操作期望截断this在头部,str在末尾截断#期望得到“is_a_test”,实际结果为“a_test_str”test_str.lstrip("this_")[:test_str.rindex("_")]为什么左边的is_也被删除了,上一节已经解释清楚了,那为什么右边的_str没有被删除呢?因为lstrip()并没有修改原来的test_str而是返回一个新的字符串,而test_str.rindex("_")定位到this_is_a_test_str原来的"_"而不是新返回的"a_test_str"_"的位置。3、删除子串的正确操作有些地方说可以使用字符串自带的replace()方法,但是replace()会替换掉所有的匹配,很粗糙。我们经常想删除特定的位置。细绳。1使用len()#samplestringtest_str="this_is_a_test_str"#期望得到"this_is_a_test",实际结果也是"this_is_a_test"test_str[:-len("_str")]2使用re.sub()importre#samplecharacterStringtest_str="this_is_a_test_str"#期望得到"this_is_a_test",实际结果也是"this_is_a_test"re.sub("_str$","",test_str)
