Z
ZHANK
基础入门

字符串详解

深入字符串的索引、切片、常用方法、格式化与转义

字符串详解

字符串是 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`

小结

  1. 字符串不可变,修改操作都返回新字符串
  2. split 切成列表,join 合并回字符串
  3. f-string 是格式化首选:f"{变量}"
  4. strip replace find startswith 是最常用的 4 个方法
  5. 处理用户输入时记得 strip() 去掉多余空白

小练习

  1. " Hello World " 变成 "hello-world"(全部小写,空格变连字符)
  2. 检查 "report.pdf" 是不是 PDF 文件(提示:endswith
  3. splitjoin"a/b/c/d" 中的斜杠换成反斜杠

💬 下一章预告:学完字符串,下一章学习条件判断 (if-else)——让程序根据条件作出不同的决策。