• Python3从头/尾删除子符串的正确操作


    一、说明

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

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

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

    2.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.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“。

    2.3 一个典型的字符串截取错误【可跳过】

    # 示例字符串
    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()会将所有匹配都进行替换这很粗糙,我们更多时候是想删掉明确位置的字符串。

    3.1 使用len()

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

    3.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)

    参考:

    https://stackoverflow.com/a/1038845

    https://www.geeksforgeeks.org/python-remove-the-given-substring-from-end-of-string/

  • 相关阅读:
    java 语言里 遍历 collection 的方式
    struts2启动报错com/opensymphony/xwork2/spring/SpringObjectFactory.java:220:-1
    mysql 查看表的类型
    memcached—向memcached中保存Java实体需注意的问题
    一个关于 UIPickerView 的 bug
    Wireshark数据抓包教程之安装Wireshark
    Mysql第四天 数据库设计
    产品经理怎样才干把一件事做出色
    Tokyo Tyrant(TTServer)系列(三)-Memcache协议
    Unity3D
  • 原文地址:https://www.cnblogs.com/lsdb/p/12519837.html
Copyright © 2020-2023  润新知