一、说明

从某个时候发现python的字符串变量自带的strip()方法,除了可以删除字符串头尾的空格,还可以用来删除头尾的字符串觉得很好用。也就一直这么用,一直也没发现什么问题。

今天在修复一个bug时使用了strip()方法但从结果看bug并没有按预期被消除,一是没怀疑strip()删除子字符串有什么问题,二是程个代码比较长,三是依赖的下层库并不太可靠,排查了大半天最后才知道是对strip()用途理解错所致,算是吃了大亏。

二、错误的删除子字符串操作示例

1 错误的strip()操作

假设我们有以下一个字符串,我们通过rstrip()删除其尾部的“str”子串没有问题,但通过rstrip()删除其尾部的“_str”子串时却出现问题。

# 示例字符串
test_str = "this_is_a_test_str"# 期望删除尾部的“str”,结果与预期相符
# 预期是“this_is_a_test_”,结果也是“this_is_a_test_”
test_str.rstrip("str")# 期望删除尾部的“_str”,结果与预期不相符。
# 预期是“this_is_a_test”,实际是“this_is_a_te”
test_str.rstrip("_str")


2 strip()原理说明

之所以会出现出现上边这种不符合预期的情况,是因为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 一个典型的字符串截取错误【可跳过】

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 示例字符串
test_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的”“的位置。

三、正确的删除子字符串操作

有些地方说可以使用字符串自带的replace()方法,但replace()会将所有匹配都进行替换这很粗糙,我们更多时候是想删掉明确位置的字符串。
1 使用len()

# 示例字符串
test_str = "this_is_a_test_str"# 期望得到“this_is_a_test”,实际结果也是“this_is_a_test”
test_str[:-len("_str")]


2 使用re.sub()

import re# 示例字符串
test_str = "this_is_a_test_str"# 期望得到“this_is_a_test”,实际结果也是“this_is_a_test”
re.sub("_str$","",test_str)

Python从头/尾删除子符串的正确操作相关推荐

  1. 【STL】string详解(string类常用的操作函数、构造函数、赋值操作、子符串的拼接、查找和替换、比较、存取、插入和删除、获取)

    目录 1. string容器 简介 2. string类常用的操作函数 3. 构造函数 4. 赋值操作 5. 字符串拼接 6. 字符串查找和替换 7. 字符串比较 8. 字符串存取 9. 字符串插入和 ...

  2. 桐花万里python路-基础篇-05-字符串及浮点数

    字符串 常用内建方法 所有的方法都包含了对Unicode的支持,有一些甚至是专门用于Unicode的 方法 描述 str.capitalize() 把字符串的第一个字符大写 str.center(wi ...

  3. python正则去除换行符,关于python:用于删除换行符的正则表达式

    我是Python的新手,我遇到了正则表达式问题. 我正在尝试删除文本文件中每行末尾的换行符,但前提是它跟在小写字母后面,即[a-z]. 如果该行的结尾以小写字母结尾,我想用空格替换换行符/换行符. 这 ...

  4. python中字符串文件如何打开_python-字符串·文件·集合操作

    原本这几个应该和列表·字典一起写的,只是我不是一起学的,所以就分开写了. 字符串操作: 特性:不可修改 一些基本语法: name.find('A') 查找A,找到返回其索引, 找不到返回-1name. ...

  5. Python源码剖析2-字符串对象PyStringObject

    二. 1.PyStringObject与 PyString_Type PyStringObject是变长对象中的不可变对象.当创建了一个PyStringObject对象之后,该对象内部维护的字符串就不 ...

  6. python列表中删除子列表_从列表列表中删除列表元素

    你试过删除列表吗?在In [84]: a = [[1, 2, 3, 4], [1, 2, 3, 5], [2, 5, 4, 3], [5, 2, 3, 1]] In [85]: a Out[85]: ...

  7. Python第三周Round2-字符串格式化

    字符串格式化其实是一个辅助的东西,赵女士今年考研不错,可以到时候用字符串的一些sao操作发个朋友圈装逼. 其实格式化就是对字符串进行各种各样的变化,来达到装逼的效果,例如word中的文字变化,用pyt ...

  8. php类对象无法转还子符串问题,php – 类stdClass的对象无法转换为字符串

    我目前遇到PHP问题,我收到此错误, 无法将类stdClass的对象转换为字符串,当我在我的站点中运行此部分代码时,会发生错误, function myaccount() { $data['user_ ...

  9. python-字符串·文件·集合操作

    原本这几个应该和列表·字典一起写的,只是我不是一起学的,所以就分开写了. 字符串操作: 特性:不可修改 一些基本语法: name.find('A') 查找A,找到返回其索引, 找不到返回-1 name ...

最新文章

  1. C++:vector中使用.clear()函数
  2. .net知识和学习方法系列(十五)类型,对象,堆栈和托管堆
  3. fastjson解析json简介
  4. redis aof 备份和恢复_Redis 持久化机制的介绍,了解这些流程很重要
  5. C# 调用其他的动态库开发应注意的问题
  6. Linux基础——怎么样从手机 (Android安卓/IOS苹果) 通过 SSH 远程 Linux
  7. 不能bostype没有元数据异常_金蝶EAS - BOS工作笔记
  8. Windows server2016 安装SqlServer2005 无法启动服务
  9. python处理excel文档_python处理excel文件
  10. 《设计心理学》读书摘要
  11. Windows10中同时安装MySQL5和MySQL8
  12. mysql32位的能装在64位的电脑上吗,32位处理器能装64位系统吗
  13. Codeforces Round #828 (Div. 3)-赛后总结
  14. ReXNet学习笔记 --- ReXNet: Diminishing Representational Bottleneck on Convolutional Neural Network
  15. MySQL:递减/递减更新一列字段值
  16. java post流_java中的post是什么意思
  17. [技术手册] 浅尝超融合之Nutanix(下)安装篇
  18. 上海居住证续办流程须知 -- 7月新政后居住证制度改革
  19. GJB 5000B 二级-MT运行维护
  20. HT7180 3.7V升12V/2A内置MOS大电流升压IC解决方案

热门文章

  1. Java课程作业02
  2. 开博首发2017年1月13日开博大吉
  3. 更改terminal的端口
  4. 2007微软技术大会(TechEd)开幕式
  5. java jdk 1.8 配置_java_Day01: java的jdk环境变量配置(1.8)
  6. 【学习笔记】CO-PA 简介
  7. SAP簇表(cluster table)BSEG使用方法
  8. SAP财务模块中,科目余额表中的数据存在数据库的哪张表中?
  9. 如何设置'REUSE_ALV_GRID_DISPLAY'的单个单元格的颜色
  10. 高级数据分析师凭什么月薪三万?一文解答你所有困惑