本文要点
strip 可以带一个参数,写成 s.strip(chars)
lstrip 只处理左端,rstrip 只处理右端,chars 的含义和 strip 一样,仍然是字符集合
replace 的用法是 s.replace(old, new),它把 s 里所有出现的 old 子串替换成 new

本文目录
先分清要处理的是端点还是任意位置
如果你手里有一行文本,两端有多余的空格或制表符,想把它清干净,先回答一个问题:这些要清理的字符只出现在两端,还是也可能出现在中间。
只在两端:用 strip、lstrip 或 rstrip。
可能出现在中间:用 replace。
这个判断决定了方法选择。strip 系列只从端点开始删,遇到不属于指定集合的字符就停;replace 则在整段文本里找完整子串并替换。两者处理的位置范围不同,这是最根本的区别。
本文只讨论 str 的 strip、lstrip、rstrip 和 replace 四个方法,示例全部是自建练习文本,不涉及真实数据。
strip 的 chars 是字符集合,不是完整前后缀
strip 可以带一个参数,写成 s.strip(chars)。这里的 chars 是一个字符集合,不是一段完整的前缀或后缀。
用自建文本举例。假设文本是 "--茶样--",你想去掉两端的连字符:
s = "--茶样--"
print(s.strip("-"))结果是 "茶样"。chars 是 "-",strip 会把两端所有属于这个集合的字符逐个删掉,直到遇到不属于集合的字符为止。
再看一个容易误判的例子。假设文本是 "ab茶样ba",你写 s.strip("ab"):
s = "ab茶样ba"
print(s.strip("ab"))结果是 "茶样"。strip 并不是去找完整的 "ab" 这个前后缀,而是把两端所有属于 {a, b} 这个字符集合的字符都删掉。所以 "ab" 和 "ba" 都被删了,因为它们的每个字符都在集合里。
如果文本是 "abc茶样cba",你写 s.strip("ab"):
s = "abc茶样cba"
print(s.strip("ab"))结果是 "c茶样c"。左端删到 c 就停了,因为 c 不在集合 {a, b} 里;右端同理。这说明 chars 是按单个字符匹配的集合,不是按整段字符串匹配。
lstrip 和 rstrip 各管一侧,规则与 strip 相同
lstrip 只处理左端,rstrip 只处理右端,chars 的含义和 strip 一样,仍然是字符集合。
用自建文本对照:
s = " --茶样-- "
print(repr(s.lstrip()))
print(repr(s.rstrip()))
print(repr(s.strip()))lstrip 去掉左端空白,右端空白保留;rstrip 去掉右端空白,左端空白保留;strip 两端都去。
带 chars 时同样按集合处理:
s = "xx茶样yy"
print(s.lstrip("x"))
print(s.rstrip("y"))lstrip("x") 只从左边删 x,结果是 "茶样yy";rstrip("y") 只从右边删 y,结果是 "xx茶样"。
一个容易忽略的点:lstrip 和 rstrip 不会因为一侧处理完就自动去处理另一侧。如果你需要两端都清理,要么用 strip,要么先 lstrip 再 rstrip。
replace 按完整子串替换,位置不限两端
replace 的用法是 s.replace(old, new),它把 s 里所有出现的 old 子串替换成 new。old 是完整子串,不是字符集合。
用自建文本对照:
s = "茶 样 记 录"
print(s.replace(" ", ""))
print(s.strip(" "))replace(" ", "") 把中间的空格也删了,结果是 "茶样记录";strip(" ") 只去两端,中间的空格保留,结果是 "茶 样 记 录"。
replace 还可以替换多字符子串:
s = "--茶样--"
print(s.replace("--", ""))结果是 "茶样"。这里 "--" 是完整子串,replace 找到它并替换。如果写成 strip("--"),效果看起来一样,但机制不同:strip 是把两端属于 {-, -} 的字符逐个删掉,replace 是找完整的 "--" 子串。
两者在什么情况下结果会不同?看这个自建例子:
s = "-茶样-"
print(s.strip("--"))
print(s.replace("--", ""))strip("--") 的结果是 "茶样",因为两端的单个 "-" 都属于集合 {-, -};replace("--", "") 的结果是 "-茶样-",因为文本里没有连续的 "--" 子串。这个对照能帮你记住:strip 按字符集合,replace 按完整子串。
怎么选:先判断端点还是任意位置,再判断集合还是子串
把选择拆成两个问题,就能快速决定用哪个方法。
第一个问题:要清理的内容只在两端,还是可能出现在中间?
只在两端:用 strip、lstrip 或 rstrip。
可能出现在中间:用 replace。
第二个问题:要清理的是“一类字符”,还是“一段完整子串”?
一类字符(比如所有空格、所有连字符):用 strip 系列,把字符集合传给 chars。
一段完整子串(比如 "--"、"\t\t"):用 replace,把完整子串传给 old。
下面是一个自建对照表,帮你把常见需求和方法对上:
| 需求 | 方法 | 说明 |
| --- | --- | --- |
| 去掉两端空白 | s.strip() | 不带参数,默认去空白 |
| 只去左端空白 | s.lstrip() | 右端不动 |
| 只去右端空白 | s.rstrip() | 左端不动 |
| 去掉两端所有连字符 | s.strip("-") | chars 是集合 |
| 去掉文本中所有空格 | s.replace(" ", "") | 中间的空格也去 |
这张表是编辑为方便对照整理的,不是官方结论。实际使用时以你的文本内容和需求为准。
检查结果:用 repr 看不可见字符,别只看打印效果
清理空格和制表符时,直接 print 往往看不出差别,因为空格和制表符在终端里不可见。建议用 repr 检查结果:
s = " 茶样\t"
print(s.strip())
print(repr(s.strip()))第一行打印出来看不出两端还有没有残留;第二行 repr 会把不可见字符显示成转义形式,方便你确认。
如果结果和你预期不一致,按下面顺序排查:
1. 确认你用的是 strip 还是 replace。两者对中间位置的处理不同。
2. 如果用了 chars,确认它是不是被当成了完整前后缀。记住它是字符集合。
3. 确认文本里是不是混了多种空白字符,比如空格、制表符、换行。不带参数的 strip 会处理这些,带 chars 时只处理你指定的集合。
4. 用 repr 看原始文本和结果,不要只靠肉眼。
以上排查顺序是编辑建议,不是官方规定。所有示例都是自建练习文本,不涉及真实数据。
使用限制:这些方法不改变原字符串,也不做格式校验
strip、lstrip、rstrip 和 replace 都返回新字符串,原字符串不变。如果你需要保留结果,要把它赋给变量或写回文件。
它们只做字符层面的处理,不做格式校验。比如你用 strip 去掉两端空白后,文本中间可能还有多余空格;replace 删掉所有空格后,原本靠空格分隔的词可能连在一起。这些后果需要你自己判断是否可接受。
另外,strip 的 chars 参数是字符集合这一点,容易和“去掉某个前缀”混淆。如果你确实需要去掉一个完整前缀,strip 不保证只去那一段,它会把两端所有属于集合的字符都去掉。这种情况下,replace 可能更合适。
本文只讨论这四个字符串方法的行为和选择,不涉及正则表达式、编码转换或文件批量处理。示例中的文件路径和内容都是自建练习数据,操作前建议先复制一份,不要拿重要文件直接试。
观看知识要点视频 18 秒
18秒无旁白要点导览,文字来自已审核正文;完整步骤、条件及参考资料见下方。
参考资料
以下原始资料提供本文依据;请结合日期、适用条件和产品说明查阅。
请结合原始资料的适用条件阅读。
返回表格与数据 →