文本,外加一堆方法
Python 字符串是由字符组成的序列,你用到它的次数会比其他任何类型都多。名字、标签、消息、URL、文件路径、API 响应,迟早都会以字符串的形式出现。
用引号创建字符串,单引号、双引号或三引号都可以:
单引号和双引号可以互换。哪种能让你少转义一个字符,就用哪种。"don't" 很干净;'don\'t' 就得加反斜杠。
字符串是不可变的。字符串一旦创建,就无法原地修改其中的字符。每个看起来在修改字符串的操作,其实都返回了一个新字符串。所以你要写 text = text.upper(),而不是只写 text.upper():不重新赋值的话,新生成的大写字符串就被丢掉了。
拼接与重复
大部分字符串组合工作,靠两个运算符就够了:
+ 拼接字符串,* 重复字符串。两者都返回新字符串。
用 + 拼接很多片段,代码很快就会变得难看。要把不同类型的值混进一条消息里,改用 f-string,详见下一节。
f-string:最常用的格式化方式
在开头的引号前加一个 f,字符串就变成了模板。{...} 中的内容会被替换成该表达式的值:
花括号里可以放任何表达式:变量、算术运算、方法调用、函数调用。不过要保持简单;如果你想把三行计算塞进 {...},先把结果算到一个有名字的变量里。
f-string 还支持在冒号后写格式说明符,用来控制数字格式、填充和对齐:
这些格式说明符和 str.format() 用的是同一套,等你熟悉了基础,值得快速浏览一遍。刚开始写代码时用不到它们。
切片:取出一部分
字符串和其他序列一样可以索引。每个字符都有一个从零开始的位置,你可以取出单个字符,也可以取出一段范围:
[start:stop:step] 这种写法在列表和其他序列中也会出现,所以花几分钟把它吃透,到处都用得上。
有两点值得特别注意:
stop索引不包含在内:word[0:2]包含索引 0 和 1,不包含 2。- 负索引从末尾开始数:
-1是最后一个字符,-2是倒数第二个,依此类推。
如何反转字符串
字符串没有 .reverse() 方法,因为它是不可变的。但用步长为 -1 的切片,一行就能搞定:
word[::-1] 的意思是“从头到尾,每次倒退 1 步”。结果是一个全新的字符串,原字符串保持不变。如果你只想倒序遍历字符,而不想真的生成一个新字符串,reversed(word) 会返回一个惰性迭代器。
如何求字符串的长度
len(text) 返回字符数:
注意,len 统计的是 Unicode 码点,而不是字节。len("café") 是 4 而不是 5,尽管它的 UTF-8 编码占用更多字节。这通常正是你想要的结果。
如何判断字符串是否包含子串
in 运算符是最地道的写法,读起来就像英语句子:
要忽略大小写,先把两边统一处理:
如果你需要的是位置,而不只是“有没有”,就用 .find():它返回索引,找不到子串时返回 -1。
常用字符串方法
字符串有几十个方法。下面这几个你会经常用到:
分割与连接:
.split(separator) 把字符串变成列表,separator.join(list_of_strings) 再把它粘回去。实际工作中的字符串处理,有很大一部分都靠这两个方法完成。
还有一组好用的搭配:
这就是一个单行配置项的解析器,只用了三行代码。字符串虽小,用处很大。
检查字符串的内容
有几个方法返回布尔值,适合放在 if 条件里:
这些方法要慎用:它们对 Unicode 的一些特殊情况,处理方式不一定符合你的预期。只要超出 ASCII 范围,就改用正则表达式模块或 unicodedata 模块。
转义特殊字符
有些字符需要加反斜杠才能出现在字符串里:
写 Windows 路径或正则表达式时,原始字符串会让事情简单很多。在引号前加一个 r,反斜杠就不再是转义字符:
字符串无处不在,所以要保持可读
三个习惯,能让大量处理字符串的代码不至于乱成一团:
- 用 f-string 做插值。 不要用
+把多种类型串在一起。 - “修改”时要重新赋值。 写
text = text.strip(),而不是单独一句text.strip()。 - 优先用
.split()和.join(),而不是手写循环来解析或拼装文本。它们更快、更清晰,也更不容易出错。
下一篇:深入 f-string。这个格式化工具你已经见过好几次了,下一篇还会讲到数字和日期的格式说明符,正是它们让 f-string 值得精通。
常见问题
Python 中的 f-string 是什么?
f-string 是以 f 开头的字符串字面量,{...} 里的内容会被替换成该表达式的值。例如:f"Hello, {name}!" 会在运行时把 name 当前的值填进字符串。
Python 中如何反转字符串?
用步长为 -1 的切片:reversed_text = original[::-1]。它返回一个新字符串,字符相同但顺序相反。原字符串保持不变,因为 Python 的字符串是不可变的。
Python 中如何分割字符串?
对字符串调用 .split()。不传参数时,它按任意空白字符分割:"a b c".split() 返回 ['a', 'b', 'c']。你也可以指定分隔符:"a,b,c".split(",") 返回 ['a', 'b', 'c']。
Python 字符串是可变的吗?
不是。字符串是不可变的:字符串一旦创建,就无法原地修改其中任何一个字符。所有看起来“修改”了字符串的方法,其实都返回一个新字符串。所以你会看到 text = text.strip() 这样的写法:把变量重新赋值为新字符串。
Python 中如何拼接字符串?
用 + 连接两个字符串:"hello" + " " + "world"。要把某个值嵌进一句话里,优先用 f-string:f"Hello, {name}"。要把列表中的很多片段连起来,用 separator.join(pieces):它比连续使用 + 更快,也更好读。
Python 中如何求字符串的长度?
调用内置函数 len(text)。它返回字符数(Unicode 码点数),所以 len("café") 是 4。要得到字节长度,先编码:len(text.encode("utf-8"))。