字符串详解
深入字符串的索引、切片、常用方法、格式化与转义
字符串详解
字符串是 Python 中使用频率最高的数据类型。从用户输入到文件读写再到 API 通信,处处离不开字符串。
学完本章你将掌握: 字符串的创建、索引切片、30+ 个常用方法、格式化输出的 4 种方式、以及中英文处理技巧。
一、创建字符串
python
# 四种创建方式
s1 = '单引号'
s2 = "双引号"
s3 = '''三引号可以
跨越多行'''
s4 = """双引号三引号
也可以跨行"""
# 空字符串
empty1 = ""
empty2 = str() # 用构造函数
# 引号内的引号
quote1 = "他说:\"你好\"" # 转义
quote2 = '他说:"你好"' # 用不同的引号
quote3 = """他说:"你好" """ # 三引号最方便
二、转义字符
| 转义序列 | 含义 |
|---|---|
| `\n` | 换行 |
| `\t` | 制表符(Tab) |
| `\\` | 反斜杠本身 |
| `\"` | 双引号 |
| `\'` | 单引号 |
python
print("第一行\n第二行\n第三行")
print("姓名:\t小明\t年龄:\t20") # 制表符对齐
# 原始字符串(不转义,处理 Windows 路径很有用)
print(r"C:\Users\小明\Documents") # 不解释 \n \t 等
三、索引与切片
python
s = "Hello Python"
# 索引(从 0 开始)
print(s[0]) # H
print(s[6]) # P
print(s[-1]) # n(倒数第一个)
print(s[-6]) # P(倒数第六个)
# 切片 [start:end:step]
print(s[0:5]) # Hello
print(s[6:12]) # Python
print(s[:5]) # Hello
print(s[6:]) # Python
print(s[::2]) # HloPto(每隔一个)
print(s[::-1]) # nohtyP olleH(反转字符串)
💡 你知道吗:字符串是不可变的。
s[0] = 'X'会报错!想修改时只能创建新字符串。
四、大小写转换
python
s = "Hello World"
print(s.upper()) # HELLO WORLD
print(s.lower()) # hello world
print(s.title()) # Hello World(每个单词首字母大写)
print(s.capitalize()) # Hello world(只有首字母大写)
print(s.swapcase()) # hELLO wORLD(大小写反转)
# 实战:不区分大小写比较
a = "Python"
b = "PYTHON"
print(a.lower() == b.lower()) # True
print(a.casefold() == b.casefold()) # True(casefold 更激进,适合德语等)
五、去除空白
python
s = " Hello World \n"
print(f"|{s.strip()}|") # |Hello World|(去两端)
print(f"|{s.lstrip()}|") # |Hello World |(去左边)
print(f"|{s.rstrip()}|") # | Hello World|(去右边)
# strip 可以指定要去除的字符
code = "###Python###"
print(code.strip("#")) # Python
六、查找与替换
python
text = "Hello World, Hello Python"
# find() — 查找子串位置,找不到返回 -1
print(text.find("Hello")) # 0
print(text.find("Hello", 1)) # 13(从索引1开始找)
print(text.find("Java")) # -1(没找到)
# index() — 和 find 类似,但找不到会抛出异常
print(text.index("World")) # 6
# print(text.index("Java")) # ❌ ValueError
# replace() — 替换所有匹配(返回新字符串)
print(text.replace("Hello", "Hi")) # Hi World, Hi Python
print(text.replace("Hello", "Hi", 1)) # Hi World, Hello Python(只替换第一个)
# count() — 统计出现次数
print(text.count("Hello")) # 2
print(text.count("l")) # 5
💡 什么时候用 find 什么时候用 index? 如果不确定子串存不存在,用
find()并检查返回值是否为 -1。确定一定存在时用index(),异常能帮你尽早发现 bug。
七、分割与合并
python
# split() — 按分隔符切分成列表
csv = "苹果,香蕉,橘子,葡萄"
fruits = csv.split(",")
print(fruits) # ['苹果', '香蕉', '橘子', '葡萄']
# 限制分割次数
print(csv.split(",", 2)) # ['苹果', '香蕉', '橘子,葡萄']
# 按空白分割(默认)
print("a b c".split()) # ['a', 'b', 'c'](默认会把连续空白当做一个)
# join() — 把列表合并成字符串
words = ["Python", "Java", "Go"]
print(" | ".join(words)) # Python | Java | Go
print("".join(words)) # PythonJavaGo
# 实战:反转字符串中的单词
s = "Hello World Python"
words = s.split()
reversed_s = " ".join(reversed(words))
print(reversed_s) # Python World Hello
八、判断方法
python
print("123".isdigit()) # True 全是数字
print("abc".isalpha()) # True 全是字母
print("abc123".isalnum()) # True 字母或数字(无空格符号)
print(" ".isspace()) # True 全是空白
print("Hello".islower()) # False
print(" hello ".isupper()) # False
# startswith / endswith(很常用!)
file = "report.pdf"
print(file.endswith(".pdf")) # True
print(file.startswith("rep")) # True
url = "https://example.com"
print(url.startswith("https://")) # True,判断 URL 协议
九、字符串格式化
四种方式,推荐 f-string:
python
name, age, score = "小明", 20, 95.567
# 方式1:f-string(Python 3.6+,最推荐)
print(f"{name},{age}岁,分数{score:.2f}")
# 方式2:format()(Python 2.6+)
print("{},{}岁,分数{:.2f}".format(name, age, score))
# 方式3:% 格式化(旧式,不推荐)
print("%s,%d岁,分数%.2f" % (name, age, score))
# 方式4:拼接(不推荐)
print(name + "," + str(age) + "岁")
f-string 高级用法:
python
# 对齐与填充
print(f"|{'左对齐':<10}|") # |左对齐 |
print(f"|{'居中':^10}|") # | 居中 |
print(f"|{'右对齐':>10}|") # | 右对齐|
# 数字格式化
print(f"{1000000:,}") # 1,000,000(千分位)
print(f"{255:x}") # ff(十六进制)
print(f"{42:b}") # 101010(二进制)
print(f"{0.856:.1%}") # 85.6%(百分比)
# 直接写表达式
import math
print(f"π ≈ {math.pi:.4f}") # π ≈ 3.1416
print(f"2^10 = {2**10}") # 2^10 = 1024
十、字符串不可变性
python
s = "hello"
# s[0] = "H" # ❌ TypeError! 字符串不能修改
# 正确的做法:创建新字符串
s = "H" + s[1:] # "Hello"
s = s.replace("h", "H", 1) # 或者用 replace
方法速查表
| 方法 | 用途 | 示例 |
|---|---|---|
| `upper()` | 全大写 | `"hi".upper()` → `"HI"` |
| `lower()` | 全小写 | `"HI".lower()` → `"hi"` |
| `strip()` | 去两端空白 | `" a ".strip()` → `"a"` |
| `split(sep)` | 分割为列表 | `"a,b".split(",")` → `["a","b"]` |
| `join(list)` | 列表合并 | `",".join(["a","b"])` → `"a,b"` |
| `replace(a,b)` | 替换 | `"ab".replace("a","x")` → `"xb"` |
| `find(x)` | 查找位置 | `"abc".find("b")` → `1` |
| `count(x)` | 统计次数 | `"aba".count("a")` → `2` |
| `startswith(x)` | 开头判断 | `"ab".startswith("a")` → `True` |
| `endswith(x)` | 结尾判断 | `"ab".endswith("b")` → `True` |
小结
- 字符串不可变,修改操作都返回新字符串
split切成列表,join合并回字符串- f-string 是格式化首选:
f"{变量}" stripreplacefindstartswith是最常用的 4 个方法- 处理用户输入时记得
strip()去掉多余空白
小练习
- 把
" Hello World "变成"hello-world"(全部小写,空格变连字符) - 检查
"report.pdf"是不是 PDF 文件(提示:endswith) - 用
split和join把"a/b/c/d"中的斜杠换成反斜杠
💬 下一章预告:学完字符串,下一章学习条件判断 (if-else)——让程序根据条件作出不同的决策。