首页 > 编程语言 >Python3从头/尾删除子符串的正确操作

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

时间:2023-04-28 10:23:42浏览次数:59  
标签:符串 rstrip 删除 字符串 str strip test 从头 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/

标签:符串,rstrip,删除,字符串,str,strip,test,从头,Python3
From: https://www.cnblogs.com/kn-zheng/p/17361096.html

相关文章

  • Python3文件路径/目录获取教程
    一、获取文件路径实现1.1获取当前文件路径importoscurrent_file_path=__file__print(f"current_file_path:{current_file_path}")__file__变量其实有个问题,当文件被是被调用文件时__file__总是文件的绝对路径;但当文件是直接被执行的文件时,__file__并不总是文件的绝对......
  • Python3压缩和解压缩实现
    一、说明压缩和解压缩是日常常用的操作,不管是windows上图形界面的操作,还是linux上用命令来进行压缩解压缩,总的而言都还是比较方便的。但用代码来实现就没做过,近期也得实现代码压缩与解压缩操作,所以就抽时间来研究一下。 二、zip文件压缩和解压缩实现importosimportzipf......
  • C语言处理特定字符串
    C语言处理特定字符串在使用NiosIDE实现串口助手向NiosII系统发送数据时,再将数据发送至FPGA逻辑模块,以此控制LED灯。在串口助手中发送14568936的数据,Nios接收到的数据是形如"14568936\r\n"的字符串,默认以\r\n结尾,要将此字符串转化为四个整型数据。#include<stdio.h>......
  • Python字符串比较
    python中的字符串之间比较是依次比较每个字符的原始值(ordinalvalue)的大小,可以使用ord0方法查看某个字符的原始值,直到两个字符串中的字符不相等时,后续字符将不再被比较print('xnjilhntm'=='xnjilhntm')#Trueprint('xnjilhntm'<'xnjilhntz')#True   ord('m') 109,ord('z......
  • 每日打卡java字符串
    importcom.ith.demo1.main;importcom.ith.demo1.phone;importjava.util.ArrayList;importjava.util.Scanner;importjava.util.StringJoiner;//PressShifttwicetoopentheSearchEverywheredialogandtype`showwhitespaces`,//thenpressEnter.Youcannows......
  • 1048. 最长字符串链
    题目描述给了一个单子数组words给了字母前身的定义:A在任何地方加一个字符,凑成B,A就是B的前身问从words中怎么选,能构成最长的词链?f1-记忆化搜索基本分析怎么找到子问题?假如s是词链的最后一个单词,那么枚举去掉s某位后的构成新的词s-1,s-1就是s的更小一级的子问题dfs怎么实现?......
  • 力扣---1048. 最长字符串链
    给出一个单词数组 words ,其中每个单词都由小写英文字母组成。如果我们可以 不改变其他字符的顺序 ,在wordA 的任何地方添加恰好一个字母使其变成 wordB ,那么我们认为 wordA 是 wordB 的前身。例如,"abc" 是 "abac" 的前身 ,而 "cba" 不是 "bcad" 的前身......
  • Python-字符串format方法指定参数
    一、字符串的format方法有几种指定参数的方式:(1)默认方式—传入的参数与{}一一对应(2)命名参数(3)未知参数{2}二、详细描述字符串的format方法如何格式化字符串:第一种方法:s1='Todayis{},thetemperatureis{}degrees.'print(s1.format('Saturday',24))第二种方法:s2='To......
  • 最长不含重复字符的子字符串
    classSolution{public:intlongestSubstringWithoutDuplication(strings){intlen=0,n=s.size(),cnt[30];memset(cnt,0,sizeofcnt);for(inti=0,j=0;j<n;j++){cnt[s[j]-'a']++;......
  • mysql 查询某字段中以逗号分隔的字符串的方法
    mysql查询某字段中以逗号分隔的字符串的方法文章目录mysql查询某字段中以逗号分隔的字符串的方法前言https://cdnvue.gymcity.com.cn/betterwe_1.0/userlogo/userlogopro62d8bf98afde709d37c08f7b129e96277388757530c72.png一、首先讲一个需求总结前言现在有如下场景。我们有一个......