Python从头/尾删除子符串的正确操作
一、說明
從某個(gè)時(shí)候發(fā)現(xiàn)python的字符串變量自帶的strip()方法,除了可以刪除字符串頭尾的空格,還可以用來刪除頭尾的字符串覺得很好用。也就一直這么用,一直也沒發(fā)現(xiàn)什么問題。
今天在修復(fù)一個(gè)bug時(shí)使用了strip()方法但從結(jié)果看bug并沒有按預(yù)期被消除,一是沒懷疑strip()刪除子字符串有什么問題,二是程個(gè)代碼比較長,三是依賴的下層庫并不太可靠,排查了大半天最后才知道是對strip()用途理解錯(cuò)所致,算是吃了大虧。
二、錯(cuò)誤的刪除子字符串操作示例
1 錯(cuò)誤的strip()操作
假設(shè)我們有以下一個(gè)字符串,我們通過rstrip()刪除其尾部的“str”子串沒有問題,但通過rstrip()刪除其尾部的“_str”子串時(shí)卻出現(xiàn)問題。
# 示例字符串 test_str = "this_is_a_test_str"# 期望刪除尾部的“str”,結(jié)果與預(yù)期相符 # 預(yù)期是“this_is_a_test_”,結(jié)果也是“this_is_a_test_” test_str.rstrip("str")# 期望刪除尾部的“_str”,結(jié)果與預(yù)期不相符。 # 預(yù)期是“this_is_a_test”,實(shí)際是“this_is_a_te” test_str.rstrip("_str")
2 strip()原理說明
之所以會(huì)出現(xiàn)出現(xiàn)上邊這種不符合預(yù)期的情況,是因?yàn)閟trip()根本不是用來刪除“給定的字符串”的,而是用來刪除給定的字符集直到遇到不在字符集中的字符為止。
在test_str.rstrip("str")中,字符集是”s“、”t“、”r“三個(gè)字符,字符串按rstrip()指示從右向左開始查找字符進(jìn)行刪除,當(dāng)刪除完”str“后遇到了”“,而”“不在字符集中所以刪除就停止了,所以得到的結(jié)果是this_is_a_test_;和刪除”str“字符串結(jié)果相一致,但這只是一種巧合。
在test_str.rstrip("_str")時(shí),字符集是”_“、”s“、”t“、”r“四個(gè)字符,字符串按rstrip()指示從右向左開始查找字符進(jìn)行刪除,當(dāng)刪除完”_str“后接下來的”t“和”s“仍都在字符集中所以仍被刪除,所以得到的結(jié)果是this_is_a_te,而不是this_is_a_test。
3 一個(gè)典型的字符串截取錯(cuò)誤【可跳過】
''' 遇到問題沒人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書! ''' # 示例字符串 test_str = "this_is_a_test_str"# 以下操作期望能去截去頭部的this和尾部的str # 期忘得到“is_a_test”,實(shí)際結(jié)果是“a_test_str” test_str.lstrip("this_")[:test_str.rindex("_")]左邊為什么is_也被刪了在上一小節(jié)已經(jīng)說清楚了,那為什么右邊的_str沒有被刪除呢,這是因?yàn)閘strip()并不修改原先的test_str而是返回一個(gè)新的字符串,而test_str.rindex("_")定位到的仍是原先this_is_a_test_str的”“的位置而不是新返回來a_test_str的”“的位置。
三、正確的刪除子字符串操作
有些地方說可以使用字符串自帶的replace()方法,但replace()會(huì)將所有匹配都進(jìn)行替換這很粗糙,我們更多時(shí)候是想刪掉明確位置的字符串。
1 使用len()
2 使用re.sub()
總結(jié)
以上是生活随笔為你收集整理的Python从头/尾删除子符串的正确操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python教程:文件路径/目录获取教程
- 下一篇: 如何正确使用Python临时文件