本页内容
Python 字符串:转换、清理、查找与格式化
字符串是你在 Python 中最常接触的数据类型:用户输入、文件内容、网页和 CSV 的每一行,都是以文本形式到达的。它们很容易被低估,因为 Python 字符串是不可变的——没有任何方法能就地修改它,每次操作都会返回一个新字符串。本页将 DelftStack 的全部 115 篇字符串指南按你要做的工作组织起来,沿着四条任务线展开:把文本转换为其他类型再转回来、清除不属于这里的字符、查找并检查字符串里有什么,以及为输出格式化或替换文本。
字符串学习路径
先用五分钟掌握基础:字符串如何构建、如何索引和切片,以及为什么不可变意味着你必须始终保留返回值。接着学习查找与清理——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 一节。
- 如何在 Python 中将字符串转换为列表 — 当家指南:按字符用
list(),按单词和字段用split(),字面文本用ast.literal_eval()——绝不要对不受控的输入用eval()。 - 在 Python 中将元组转换为字符串 —
str()保留元组的结构,join()给出干净的带分隔结果,按元素逐个str()的生成器则能处理混合类型。 - 在 Python 中将字典转换为字符串 — 四条途径:手写循环、
str()、用于交换的json.dumps(),以及让嵌套更易读的pprint.pformat()。 - Python 中与 tostring() 等效的操作 — Python 没有
toString():单个值用str(),多个值用join(),消息用 f 字符串,自己的类用__str__()。 - 在 Python 中把字符串列表转换为整数 — 同一个转换的四种写法:推导式、
map(int, ...)、显式循环,以及面向大数据集的 NumPy。 - 在 Python 中将 Bytearray 转换为字符串 — 说明为什么
bytes()会留下一个b'...'的 repr,而bytearray.decode()返回真正的文本。 - 在 Python 中将字符串转换为二进制 — 把用
ord()得到的按码点二进制,与用带08b补零的bytearray()得到的按编码字节二进制区分开。 - 在 Python 中将字符串转换为布尔值 — 从陷阱讲起——
bool("False")是True——然后构建一个显式的词元解析器,遇到未知拼写就抛错。
清理与删除:去掉不属于这里的东西
清理是这个集群的主场:抓取的页面、导出文件和用户输入到达时都带着从未被邀请的字符。按污垢的形态来选:一个已知的子字符串用 replace(),一整组字符一次性处理用带转换表的 translate(),污垢是模式而非字面量时用正则表达式。
- 在 Python 中从字符串中删除 xa0 的方法 — 对付不可见不换行空格的两招:用
unicodedata.normalize("NFKD", ...)分解,以及直接replace("\xa0", " ")。 - 在 Python 中从字符串中删除逗号 — 删除每个逗号用
replace(",", ""),只删第一个用count参数,做模式处理用re.sub()。 - 如何在 Python 中从一个字符串中删除标点符号 — 全套工具:对
string.punctuation过滤、用正则[^\w\s]替换,以及用maketrans()构建的快速str.translate()转换表。 - 在 Python 中从字符串中删除引号 —
replace()清除所有位置的引号;strip('"')只修剪首尾的那一对,内部引号不受影响。 - 在 Python 中删除字符串中的特殊字符 — 先定义什么叫「特殊」,再分别用
isalnum()过滤、translate()字符集,或只匹配 ASCII 的正则。 - 在 Python 中从字符串中删除换行符 \n — 删除换行用
replace(),把多行以单个空格重新拼接用split()加join(),空白混杂时用正则。 - 如何在 Python 中删除字符串中的最后一个字符 — 切片搞定:
s[:-1]去掉最后一个字符,负索引还能推广到最后三个字符。
查找、检查与计数
查找是这个集群最大的未满足需求:读者知道自己想要哪个字符,需要的是它的位置、它的数量,或一个是与否的答案。把分工理清——in 回答有没有,find() 回答第一个在哪里,index() 回答在哪里并在找不到时大声报错,count() 回答有多少个。
- 如何在 Python 字符串中查找字符 — 第一个匹配用
find(),最后一个用rfind(),缺失应当抛错时用index(),要全部索引则用enumerate()循环。 - 在 Python 中计算字符串中字符的出现次数 — 数单个字符用
str.count(),连同其不重叠子字符串的计数规则;需要数每个字符时用collections.Counter。 - 在 Python 中检查字符串是否包含单词 — 简单测试用
in,并注意"is" in "This"为真;整词匹配重要时,用带\b单词边界的正则。 - 在 Python 中检查变量是否为字符串 — 默认用
isinstance(value, str),更严格的type()比较会漏掉子类,另有 try-except 的变体写法。 - 如何在 Python 中使用 if 语句比较字符串 — 用
==、in成员判断和大小写归一化比较来构造条件;is检查的是身份,不是文本。 - Python 查找字符串中的所有出现 — 快速求总数用带边界的
count(),返回全部索引用基于startswith()的推导式。
大小写、比较与填充
大小写是比较悄悄出错的地方:Python 按 Unicode 码点比较,所以大小写和特殊字母都算数。比较前先归一化——普通文本用 lower() 或 upper(),需要让 Unicode 配对相等时用 casefold()——展示时再用 ljust()、rjust()、center() 或 zfill() 填充。
- Python 中不区分大小写的字符串比较 — 先用
lower()或upper()把两边归一化,再给出 Unicode 层面的理由,说明casefold()为何能让straße与STRASSE相等。 - 在 Python 中用空格填充字符串 — 全套方法:
ljust()、rjust()、带填充字符的center(),外加用于对齐输出的%、format()和 f 字符串等价写法。 - 在 Python 中比较字符串 — 运算符参考:相等用
==和!=,字典序用<和>,顺序由第一个不同的码点决定。 - 在 Python 中逐字符比较两个字符串 — 用
zip()把字符配对并统计相同位置的数量,显式处理None输入和长度不等的情形。
格式化与替换
对新代码来说,格式化就是 f 字符串:值就坐在模板里你能读到的位置,格式规格控制宽度和精度。当模板独立存放或要复用时,str.format() 依然是对的选择,而 % 格式化则存活在你还会遇到的旧代码里。替换和一切其他操作一样服从不可变性——你从不编辑一个字符串,你构建那个修正后的新字符串。
- 在 Python 中替换字符串中的字符 — 按索引转列表赋值、在已知位置前后切片,或用
replace()处理每个匹配——每种都返回新字符串。 - Python 字符串格式中 %s 和 %d 的区别 —
%s通过str()转换接受任何值;%d要求整数并截断小数——大多数意外背后的那条历史区分。 - The sprintf() Function in Python — Python 没有
sprintf();这项工作对应到%运算符、format()、f 字符串,或一个手写的包装函数。 - 在 Python 中的索引处替换字符串中的字符 —
Meatloaf例子两种解法——切片重建,或修改列表副本——并扩展到多个索引。
字符串方法地图
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 字符串指南
基础
- 在 Python 中复制字符串
- 在 Python 中重复字符串 N 次
- 在 Python 中创建一个多行字符串
- 在 Python 中循环遍历字符串
- How to Append One String to Another in Python
- 在 Python 中连接字符串和整数值
- 在 Python 中向字符串添加字符
- Python 中的 String Builder 等效
- How to Insert String Into a String in Python
- How to Fix String Indices Must Be Integers Error in Python
转换
- 如何在 Python 中将字符串转换为列表
- 在 Python 中将元组转换为字符串
- 在 Python 中把字符串列表转换为整数
- 在 Python 中将 Bytearray 转换为字符串
- 在 Python 中将字典转换为字符串
- Python 中与 tostring() 等效的操作
- 如何在 Python 中将字符串转换为浮点或整数
- 如何在 Python 中将浮点数转换为字符串
- 在 Python 中将字符串转换为 Unicode
- 在 Python 中将字符串转换为二进制
- 在 Python 中将字符串转换为布尔值
- 如何在 Python 中将整数转换为字符串
- 在 Python 中将浮点数格式化为字符串
- 在 Python 中将列表转换为逗号分隔的字符串
- 如何在 Python 中将列表转换为字符串
- 在 Python 中连接字符串列表
- 在 Python 中将字符串拆分为 Char 数组
- How to Parse String to List in Python
- 如何在 Python 中基于多个定界符分割字符串
- 在 Python 中根据空格拆分字符串
- 在 Python 中将字符串分成两半
- 在 Python 中将字符串转换为 ASCII 值
- 在 Python 中将 Unicode 字符转换为 ASCII 字符串
- 在 Python 中转换字符串为双精度数
- 在 Python 中将字符串转换为小数
- 如何在 Python 2 和 Python 3 中将字节转换为字符串
- How to Convert String to Bytes in Python
- 在 Python 中将日期时间转换为字符串
- Python 如何将字符串转换为时间日期 datetime 格式
- 在 Python 中将字符串转换为变量名
- Python JSON 字符串化
- 在 Python 中将字符串转换为浮点值
- 在 Python 中将字符串转换为整数
清理与删除
- 在 Python 中从字符串中删除 xa0 的方法
- 在 Python 中从字符串中删除逗号
- 如何在 Python 中从一个字符串中删除标点符号
- 在 Python 中从字符串中删除引号
- 在 Python 中删除字符串中的特殊字符
- 在 Python 中从字符串中删除换行符 \n
- 如何在 Python 中删除字符串中的最后一个字符
- 在 Python 中从字符串中删除某些字符
- 在 Python 中从字符串中删除数字
- 在 Python 中从字符串中删除换行符
- 在 Python 中删除字符串中的第一个字符
- How to Remove Parentheses From String in Python
- 如何在 Python 中从字符串中删除子字符串
- Python 如何去掉字符串中的空格/空白符
查找、检查与计数
- 在 Python 中检查字符串是否包含单词
- 在 Python 中检查变量是否为字符串
- 如何在 Python 中检查字符串是否包含数字
- 在 Python 中检查字符串是否为整数
- 如何在 Python 字符串中查找字符
- 在 Python 中计算字符串中字符的出现次数
- 如何在 Python 中使用 if 语句比较字符串
- Python 查找字符串中的所有出现
- 在 Python 中检查字符串是否为数字
- 如何在 Python 中检查字符串是否包含子字符串
- How to Check if a Word Exists in a String in Python
- 在 Python 字符串中查找字符的所有索引
- 从 Python 中的字符串中提取子字符串
- 如何在 Python 中从字符串中提取数字
- 在 Python 中计算字符串中的单词
- How to Count Vowels in a String Using Python
- Python 中最长的公共子字符串
- 在 Python 中查找列表中的字符串
- How to Match Fuzzy String in Python
- Python 检查列表是否包含字符串
- Python 在文件中查找字符串
- 如何以 Pythonic 的方式检查字符串是否为空
大小写、比较与填充
- Python 中不区分大小写的字符串比较
- 在 Python 中用空格填充字符串
- 在 Python 中比较字符串
- 在 Python 中逐字符比较两个字符串
- 在 Python 中用零填充字符串
- How to Captilize String in Python
- Python 中的右对齐字符串
- How to Sort String Alphabetically in Python
格式化与替换
- The sprintf() Function in Python
- 在 Python 中替换字符串中的字符
- Python 字符串格式中 %s 和 %d 的区别
- 在 Python 中的索引处替换字符串中的字符
- Python 中的字符串插值
- How to Solve the TypeError: Not All Arguments Converted During String Formatting in Python
- 修复 TypeError:没有足够的参数导致 Python 中的格式字符串错误
- How to Fix TypeError: Non-Empty Format String Passed to Object.format in Python
- 使用 Python 替换文件中的字符串
- 在 Python 中打印字符串和变量
更多字符串文章
- 加密 Python 字符串
- 在 Python 中根据函数的字符串名称调用函数
- B in Front of String in Python
- Python 中的原始字符串
- Python 中的原始字符串和 Unicode 字符串
- 在 Python 中反转字符串
- Python 中字符串的排列
- 在 Python 中将文件读取为字符串
- 在 Python 中向文件写入字符串
- How to Print String to Text File Using Python
- 使用 Python 套接字发送字符串
- How to Quote Backslash in String in Python
- How to Fix Error - EOL While Scanning String Literal in Python
- How to Fix TypeError: str Returned Non-String but Printing Output
- 在 Python 中访问文档字符串
- Python 中最常见的 Docstring 模式
- 如何在 Python 中执行两个字符串的按位异或操作
- 在 Python 中生成随机字符串
以上就是这个字符串集群的全部内容。想要更全的地图——列表、字典、文件、日期和错误——请回到 Python 支柱,在那里 Dictionary 组和 List 组与本页展开的 Strings 组并列。