Skip to content

Python 字符串 ​

姓名、手机号、商品标题、文件路径和网页内容,在程序中通常都要使用字符串保存。

上一节的学习信息卡已经使用了字符串:

python
student_name = "小明"
course_name = "Python 核心编程"

print("姓名:", student_name)
print("课程:", course_name)

这一节继续解决三个问题:怎样创建字符串、怎样把变量放进字符串,以及怎样清理和修改文本。

Python 字符串本质模型与核心处理任务

字符串的创建与组合 ​

字符串的类型是 str,可以使用单引号、双引号或三引号创建。

python
student_name = "小明"
course_name = 'Python 核心编程'

print(type(student_name))
print(type(course_name))

运行结果:

text
<class 'str'>
<class 'str'>

引号与多行字符串 ​

单引号和双引号创建的字符串没有本质区别。字符串内部包含某种引号时,可以用另一种引号包住它:

python
question = "What's your name?"
message = '他说:"正在学习 Python。"'

print(question)
print(message)

这样可以减少转义字符,让代码更容易阅读。

多行字符串

三个单引号或三个双引号可以创建多行字符串,并保留其中的换行:

python
course_notice = """Python 核心编程
上课时间:周六 09:00
请提前准备开发环境"""

print(course_notice)

运行结果:

text
Python 核心编程
上课时间:周六 09:00
请提前准备开发环境

三引号不是多行注释

三个引号创建的仍然是字符串。放在模块、函数或类的特定位置时,它可以作为文档字符串;普通代码注释仍然使用 #。

单引号、双引号和三引号创建字符串的对比图

类型转换与基本运算 ​

使用 str() 可以把数字等数据转换成字符串:

python
age = 18
age_text = str(age)

print(age_text)
print(type(age_text))

运行结果:

text
18
<class 'str'>

+ 可以连接字符串,* 可以重复字符串:

python
first_name = "张"
last_name = "三"
full_name = first_name + last_name

print(full_name)
print("-" * 20)

运行结果:

text
张三
--------------------

+ 两边必须都是字符串。字符串和数字不能直接拼接:

python
age = 18
print("年龄:" + age)

这段代码会出现 TypeError。可以先转换类型:

python
age = 18
print("年龄:" + str(age))

不过,当字符串中需要放入多个变量时,更推荐使用字符串格式化。

格式化字符串 ​

字符串格式化就是先预留位置,再把变量的值放进去。

Python 常见的格式化方式有三种:

  1. f-string:当前课程优先使用
  2. .format():很多项目中仍然常见
  3. %:主要用于阅读和维护较早的代码

f-string 格式化 ​

在字符串前加上字母 f,再把变量写进 {}:

python
student_name = "张三"
age = 18
course_name = "Python 核心编程"

message = f"姓名:{student_name},年龄:{age},课程:{course_name}"
print(message)

运行结果:

text
姓名:张三,年龄:18,课程:Python 核心编程

f-string 中的 {} 还可以放简单表达式:

python
price = 12.5
quantity = 4

print(f"商品总价:{price * quantity}")

控制数字显示格式

在变量后写 :,可以设置显示格式:

python
price = 12.5
progress = 0.856

print(f"商品单价:{price:.2f} 元")
print(f"学习进度:{progress:.1%}")

运行结果:

text
商品单价:12.50 元
学习进度:85.6%
  • .2f:按照两位小数显示
  • .1%:转成百分比,并保留一位小数

格式化只改变显示方式,不会修改变量原来的值。

不要漏掉字符串前面的 f

python
name = "张三"
print("你好,{name}")

这段代码会原样输出 {name}。正确写法是:

python
name = "张三"
print(f"你好,{name}")

format() 与 % 格式化 ​

format() 格式化

.format() 同样使用 {} 作为占位符,再按顺序填入数据:

python
student_name = "张三"
age = 18

message = "姓名:{},年龄:{}".format(student_name, age)
print(message)

也可以在占位符中指定名称:

python
message = "姓名:{name},年龄:{age}".format(name="张三", age=18)
print(message)

新代码优先使用 f-string,但看到 .format() 时要能读懂。

% 格式化

% 格式化在较早的 Python 代码中很常见:

python
student_name = "张三"
age = 18

message = "姓名:%s,年龄:%d" % (student_name, age)
print(message)

常见格式化符号如下:

符号作用示例
%s转换为字符串"姓名:%s" % name
%d十进制整数"年龄:%d" % age
%06d整数不足 6 位时在左侧补 0"%06d" % 25
%f浮点数"%f" % price
%.2f浮点数保留两位小数"%.2f" % price
%%输出百分号 %"进度:80%%" % ()
%c单个字符或字符对应的整数"%c" % 65
%o八进制整数"%o" % 8
%x十六进制整数"%x" % 255
%e科学计数法"%e" % 1000

三种格式化方式怎样选择

  • 自己编写新代码:优先使用 f-string
  • 阅读已有项目:需要认识 .format() 和 %
  • 同一段代码中:尽量保持一种写法,不要来回混用

f-string、format 和百分号格式化方式的对比图

常用字符串操作 ​

字符串方法可以完成清理、替换、拆分和判断等操作。方法通常写在字符串变量后面:

text
字符串.方法名()

字符串方法调用机制与常用操作分类

清理与替换 ​

strip() 默认去掉字符串左右两端的空白字符,不会删除中间的空格:

python
text = "  hello Python  "
clean_text = text.strip()

print(f"|{text}|")
print(f"|{clean_text}|")

运行结果:

text
|  hello Python  |
|hello Python|

也可以指定要从两端去掉的字符:

python
text = "###hello Python###"
print(text.strip("#"))

运行结果:

text
hello Python

strip() 不是删除指定前后缀

strip("abc") 会持续删除两端出现的 a、b、c 字符,并不是删除一个完整的 abc 前缀或后缀。

替换内容与不可变特性

replace(old, new) 把旧内容替换成新内容:

python
message = "hello world"

message.replace("world", "Python")
print(message)

message = message.replace("world", "Python")
print(message)

运行结果:

text
hello world
hello Python

字符串是不可变类型。replace() 会返回一个新字符串,不会直接修改原字符串。第一次调用没有接收返回值,所以 message 没有变化;第二次把新字符串重新赋值给 message,修改结果才被保存。

strip()、replace()、upper() 等字符串方法都遵循这个规律。

字符串方法返回新字符串而不是原地修改的说明图

拆分与连接 ​

split() 把一个字符串拆成多个部分:

python
course_text = "Python,Java,Go"
course_list = course_text.split(",")

print(course_list)

运行结果:

text
['Python', 'Java', 'Go']

join() 使用指定字符串把多个字符串连接起来:

python
course_list = ["Python", "Java", "Go"]
course_text = " | ".join(course_list)

print(course_text)

运行结果:

text
Python | Java | Go

join() 的成员必须都是字符串。下面的代码会出现 TypeError:

python
print(",".join([1, 2, 3]))

列表会在后面的数据容器章节中详细讲解。当前阶段先把它理解为按顺序保存多个数据的结构。

使用 split 拆分字符串并使用 join 重新连接的流程图

大小写转换与内容判断 ​

常见方法如下:

方法作用示例结果
text.upper()转换为大写"Python" → "PYTHON"
text.lower()转换为小写"Python" → "python"
text.title()每个单词首字母大写"hello python" → "Hello Python"
text.isupper()判断字母是否全部为大写返回 True 或 False
text.startswith(prefix)判断是否以指定内容开头返回 True 或 False
text.endswith(suffix)判断是否以指定内容结尾返回 True 或 False
python
text = "hello Python"

print(text.upper())
print(text.title())
print(text.startswith("hello"))
print(text.endswith("Python"))

运行结果:

text
HELLO PYTHON
Hello Python
True
True

转义字符与原始字符串 ​

转义字符 ​

有些字符很难直接写进普通字符串。例如,我们需要在字符串中表示换行、制表符或反斜杠。这时可以使用以反斜杠 \ 开头的转义字符。

转义字符机制与终端视觉效果

转义字符作用
\\表示一个反斜杠
\'表示单引号
\"表示双引号
\n换行
\t水平制表符
\r回车
python
print("第一行\n第二行")
print("姓名\t课程")
print("张三\tPython")
print("安装目录:C:\\Python314")

运行结果:

text
第一行
第二行
姓名    课程
张三    Python
安装目录:C:\Python314

\t 不是固定数量的空格

\t 表示水平制表符,会移动到下一个制表位置。它显示出来的宽度受终端和当前位置影响,不能简单理解为“四个空格”。

如果一行代码过长,优先使用括号换行。虽然反斜杠放在代码行末也可以续行,但它容易因为后面多出空格或注释而出错,当前课程不推荐这种写法。

原始字符串与文件路径 ​

Windows 路径中包含很多反斜杠。普通字符串可能把 \n、\t 等内容识别成转义字符:

python
path = "C:\\new_project\\test.py"
print(path)

除了写成双反斜杠,还可以在引号前加 r,创建原始字符串:

python
path = r"C:\new_project\test.py"
print(path)

运行结果:

text
C:\new_project\test.py

原始字符串会把大多数反斜杠当成普通字符,很适合保存 Windows 路径和正则表达式。

原始字符串不能以单个反斜杠结尾

下面的写法会出现 SyntaxError:

python
path = r"C:\new_project\"

路径需要以反斜杠结尾时,可以使用普通字符串并写成双反斜杠,或者调整字符串的组合方式。

Windows 路径转义冲突与原始字符串 r 对比图

综合案例:清洗课程通知 ​

现在处理一段从网页中取得的课程信息。原始内容包含多余空格、&nbsp; 和 <br>:

python
raw_text = "  Python 核心编程&nbsp;<br>上课时间:周六 09:00<br>请提前准备开发环境  "

需求如下:

  1. 删除两端空格和 &nbsp;
  2. 按照 <br> 拆分内容
  3. 使用换行符重新合并
  4. 添加通知标题并输出

第一步:清理并拆分内容

python
raw_text = "  Python 核心编程&nbsp;<br>上课时间:周六 09:00<br>请提前准备开发环境  "

clean_text = raw_text.replace("&nbsp;", "").strip()
notice_lines = clean_text.split("<br>")

print(notice_lines)

运行结果:

text
['Python 核心编程', '上课时间:周六 09:00', '请提前准备开发环境']

第二步:合并并格式化通知

python
raw_text = "  Python 核心编程&nbsp;<br>上课时间:周六 09:00<br>请提前准备开发环境  "

clean_text = raw_text.replace("&nbsp;", "").strip()
notice_lines = clean_text.split("<br>")
notice_body = "\n".join(notice_lines)
notice_title = "课程通知"
notice = f"【{notice_title}】\n{notice_body}"

print(notice)

运行结果:

text
【课程通知】
Python 核心编程
上课时间:周六 09:00
请提前准备开发环境

这个案例按顺序使用了 replace()、strip()、split()、join() 和 f-string。处理文本时,也可以先把需求拆成这样的小步骤,再逐步检查每一步的结果。

常见问题 ​

问题排查方法
引号没有成对出现检查字符串开始和结束的引号;内部也有引号时,可以换一种引号包裹或使用转义字符
拼接字符串和数字时报错"年龄:" + 18 会出现 TypeError,可以使用 str(18) 或 f-string
调用方法后原字符串没有变化字符串不可变,需要使用变量接收方法返回的新字符串
路径中的反斜杠显示异常检查是否包含 \n、\t 等转义组合,改用 \\ 或原始字符串

动手练习 ​

  1. 使用 f-string 输出姓名、年龄和课程名称,并让年龄保持数字类型。
  2. 把字符串 " hello world " 两端的空白去掉,再把 world 替换成 Python。
  3. 把字符串 "Python,Java,Go" 拆开,再使用 " | " 重新连接。
  4. 根据用户输入的页码,生成对应的猫眼榜单地址。
  5. 分别使用普通字符串和原始字符串表示路径 C:\course\new\test.py。

小结 ​

本节课最核心的是掌握 5 件事:

  1. 字符串可以使用单引号、双引号和三引号创建
  2. 新代码优先使用 f-string,已有代码中还会看到 .format() 和 %
  3. strip()、replace()、split() 和 join() 可以完成常见文本处理
  4. 字符串不可变,方法返回的结果需要使用变量接收
  5. 遇到换行、引号和路径时,要会使用转义字符或原始字符串

延伸阅读:Python 3.14 字符串入门、格式化字符串、字符串方法