本页内容

Python 字符串:转换、清理、查找与格式化

字符串是你在 Python 中最常接触的数据类型:用户输入、文件内容、网页和 CSV 的每一行,都是以文本形式到达的。它们很容易被低估,因为 Python 字符串是不可变的——没有任何方法能就地修改它,每次操作都会返回一个新字符串。本页将 DelftStack 的全部 115 篇字符串指南按你要做的工作组织起来,沿着四条任务线展开:把文本转换为其他类型再转回来、清除不属于这里的字符、查找并检查字符串里有什么,以及为输出格式化或替换文本。

Python 字符串操作一览:转换、清理、查找与格式化文本

字符串学习路径

先用五分钟掌握基础:字符串如何构建、如何索引和切片,以及为什么不可变意味着你必须始终保留返回值。接着学习查找与清理——find()、in 运算符、strip() 和 replace() 能处理日常文本工作的大部分。然后进入转换,字符串在这里与列表、数字、字典和字节互换位置。最后是格式化与替换,f 字符串是默认选择,旧式写法只在仍有其用武之地时才出现。以下每一步对应本页的一个分组,顺序就是学习顺序。

五分钟基础:构建、拼接与重复

字符串是由单引号或双引号包围的字符序列;三引号可以跨多行,索引加切片可以读取它的任意部分。有两个事实承担了大部分工作:len() 测量字符串的长度,而构建一个更长的字符串总是产生一个新值。

  • 在 Python 中重复字符串 N 次 — 用 * 乘法生成固定份数的副本,再用重复加切片精确命中目标长度,并对空源和负长度做校验。
  • 在 Python 中复制字符串 — 在解释了不可变性为何让两个变量共享同一个值之后,给出六种复制途径——空字符串拼接、完整切片、str()、%、format() 和 f 字符串。
  • 在 Python 中创建一个多行字符串 — 真正的多行文本用三引号,一个逻辑行用反斜杠和括号拼接,定宽输出用 textwrap.fill()。
  • How to Append One String to Another in Python — + 与 str.join() 的对比;片段很多时 join() 胜出,因为每次 + 都会构建一个新的中间字符串。

转换:字符串与列表、数字互转

转换是字符串工作真正见价值的地方:数据以文本到达,又以另一种形态被使用。列表是最繁忙的出入口,数字次之;容器用 str() 或 join() 摊平,字节只能通过显式编码跨越。有一个邻居住在别处:把 datetime 转成字符串属于 Datetime 指南——见 在 Python 中将 Datetime 转换为字符串 和 Python 支柱 的 Datetime 一节。

清理与删除:去掉不属于这里的东西

清理是这个集群的主场:抓取的页面、导出文件和用户输入到达时都带着从未被邀请的字符。按污垢的形态来选:一个已知的子字符串用 replace(),一整组字符一次性处理用带转换表的 translate(),污垢是模式而非字面量时用正则表达式。

查找、检查与计数

查找是这个集群最大的未满足需求:读者知道自己想要哪个字符,需要的是它的位置、它的数量,或一个是与否的答案。把分工理清——in 回答有没有,find() 回答第一个在哪里,index() 回答在哪里并在找不到时大声报错,count() 回答有多少个。

大小写、比较与填充

大小写是比较悄悄出错的地方:Python 按 Unicode 码点比较,所以大小写和特殊字母都算数。比较前先归一化——普通文本用 lower() 或 upper(),需要让 Unicode 配对相等时用 casefold()——展示时再用 ljust()、rjust()、center() 或 zfill() 填充。

格式化与替换

对新代码来说,格式化就是 f 字符串:值就坐在模板里你能读到的位置,格式规格控制宽度和精度。当模板独立存放或要复用时,str.format() 依然是对的选择,而 % 格式化则存活在你还会遇到的旧代码里。替换和一切其他操作一样服从不可变性——你从不编辑一个字符串,你构建那个修正后的新字符串。

字符串方法地图

Python 内置了 47 个字符串方法,这张地图能帮你快速找到对的那个。按动词来读:is* 家族负责检查,大小写方法负责变换,split 和 join 负责拆开与重组,搜索方法负责定位。某个方法有更深入的指南时,第三列会链过去;单元格为空表示一句话说明已经足够。

方法 作用 深入阅读
capitalize() 将第一个字符大写,其余字符小写
casefold() 为不区分大小写的匹配而生的激进小写化 深入阅读
center() 把字符串放在给定宽度字段的中央 深入阅读
count() 统计子字符串不重叠出现的次数 深入阅读
encode() 按选定的编码把字符串编码为字节
endswith() 测试字符串是否以某个后缀结尾
expandtabs() 把制表符替换为空格
find() 子字符串的最小索引,找不到时为 -1 深入阅读
format() 把值格式化进 {} 占位符
format_map() 与 format() 类似,但值取自一个映射
index() 子字符串的最小索引,找不到时抛出 ValueError 深入阅读
isalnum() 每个字符都是字母或数字时为 True 深入阅读
isalpha() 每个字符都是字母时为 True
isascii() 每个字符都是 ASCII 时为 True
isdecimal() 每个字符都是十进制数字时为 True
isdigit() 每个字符都是数字时为 True 深入阅读
isidentifier() 字符串是合法的 Python 标识符时为 True
islower() 所有带大小写的字符都是小写时为 True
isnumeric() 每个字符都是数值时为 True
isprintable() 每个字符都可打印时为 True
isspace() 每个字符都是空白时为 True
istitle() 字符串是标题式大小写时为 True
isupper() 所有带大小写的字符都是大写时为 True
join() 以本字符串为分隔符连接一个字符串可迭代对象
ljust() 在给定宽度的字段中左对齐 深入阅读
lower() 返回小写副本 深入阅读
lstrip() 去除前导字符(默认为空白)
maketrans() 为 translate() 构建转换表 深入阅读
partition() 在第一个分隔符处切成三元组
removeprefix() 存在前缀时将其去除
removesuffix() 存在后缀时将其去除
replace() 把子字符串的出现替换为另一个字符串 深入阅读
rfind() 子字符串的最大索引,找不到时为 -1 深入阅读
rindex() 子字符串的最大索引,找不到时抛出 ValueError
rjust() 在给定宽度的字段中右对齐 深入阅读
rpartition() 在最后一个分隔符处切成三元组
rsplit() 从右侧计数,在分隔符处拆分
rstrip() 去除尾部字符(默认为空白)
split() 在分隔符处拆分为列表 深入阅读
splitlines() 在行边界处拆分为列表
startswith() 测试字符串是否以某个前缀开头 深入阅读
strip() 去除前导和尾部字符 深入阅读
swapcase() 返回每个字符大小写互换的副本
title() 返回标题式大小写的副本,每个单词首字母大写
translate() 通过转换表映射字符 深入阅读
upper() 返回大写副本 深入阅读
zfill() 用前导零填充到给定宽度 深入阅读

常见问题

在 Python 中如何把字符串转换为列表?

先决定每个元素应该是什么,再挑对应的工具。list(text) 按字符逐个给出元素;text.split() 给出单词,text.split(",") 给出以分隔符切分的字段,并保留空字段。对于已经长得像 Python 列表的文本,用 ast.literal_eval() 解析,并确认结果确实是列表。绝不要对你无法控制的输入使用 eval()。完整讲解见 如何在 Python 中将字符串转换为列表。

如何检查字符串是否包含某个子字符串或单词?

做简单的子字符串测试,用 in 运算符:"word" in text 返回布尔值,且区分大小写。还需要位置时,find() 返回第一个索引或 -1,而 index() 则会抛出 ValueError。注意 in 也会在更大的单词内部命中——"is" in "This" 为真——所以针对整词时,要么分词,要么用带 \b 边界的正则,如 在 Python 中检查字符串是否包含单词 所示。

如何从字符串中删除标点或特殊字符?

先定义什么必须去掉:只是标点,还是字母和数字之外的一切。对于标点,可以对 string.punctuation 过滤、用正则 [^\w\s] 替换,或用 maketrans() 构建的 str.translate() 转换表一次性删除整组字符——这是最快的选项。清理范围更大时,isalnum() 过滤会保留 Unicode 字母和数字。如何在 Python 中从一个字符串中删除标点符号 逐一讲解了每种变体。

为什么 Python 会说「not all arguments converted during string formatting」?

这个 TypeError 来自 % 格式化:模板中的占位符比你传的值元组要少,于是 Python 走到模板末尾时还剩下没用完的参数——例如 "Value: " % (1, 2)。让每个值恰好对应一个占位符,单个值用只含一个元素的元组包装,字面的百分号写成 %%` 转义。有一篇专门讲这个错误的指南逐例拆解了这条消息。

Python 里有 toString() 吗?

没有。Python 没有 toString() 方法;找它是从 Java 带过来的习惯。等价物是内置的 str(value),它能为数字、集合和大多数对象返回可读的字符串。要合并许多字符串用 join(),构建消息用 f 字符串,想控制自己类的打印方式就在类上定义 __str__()。注意 str() 产生的是展示文本,不是 JSON 或 CSV。见 Python 中与 tostring() 等效的操作。

如何替换特定索引处的一个字符?

你不能向字符串里赋值——text[2] = "m" 会抛出 TypeError,因为字符串不可变。改为构建替换结果:在该位置前后切片,text[:2] + "m" + text[3:],或先转成列表、在索引处赋值,再用 "".join(...) 重新拼接。两种方法都返回新字符串且不触碰原字符串;索引来自用户输入时,要用 len(text) 对它做校验。在 Python 中的索引处替换字符串中的字符 展示了两种方法。

全部 Python 字符串指南

基础

转换

清理与删除

查找、检查与计数

大小写、比较与填充

格式化与替换

更多字符串文章