来源:黑马程序员Python基础课程 + Python 3.11官方文档 + 网络资料整理


一、详细讲解

1.1 字符串基本特性

Python 字符串是不可变序列(Immutable Sequence),所有修改操作都会返回新字符串:

s = "Hello"
# s[0] = "J"  # TypeError: 'str' object does not support item assignment

# 正确做法:创建新字符串
s2 = "J" + s[1:]
print(s2)  # Jello

# 字符串长度
print(len("Hello"))  # 5

1.2 字符串索引与切片

s = "Python是最流行的编程语言"

# 正向索引(从0开始)
print(s[0])   # P
print(s[7])   # 是

# 反向索引(从-1开始)
print(s[-1])  # 言
print(s[-4])  # 编

# 切片 s[start:end:step]
print(s[0:6])     # Python(不含end)
print(s[7:10])     # 是最流
print(s[:6])       # Python(省略start=0)
print(s[7:])       # 是最流行的编程语言(省略end=len)
print(s[::2])      # Pto无流编言言(步长2)
print(s[::-1])     # 言语言程编的行流最是(逆序)

1.3 常用字符串方法

查找与替换:

s = "Hello World, Hello Python"

# find/rindex:查找子串位置(找不到返回-1 或 抛异常)
print(s.find("World"))   # 6
print(s.find("Java"))    # -1
print(s.rfind("Hello"))  # 13(从右向左找)

# count:统计出现次数
print(s.count("Hello"))  # 2

# replace:替换(返回新字符串)
s2 = s.replace("Hello", "Hi")
print(s2)  # Hi World, Hi Python

# partition/rpartition:分割为三部分
print(s.partition("World"))   # ('Hello ', 'World', ', Hello Python')
print(s.rpartition("Hello")) # ('Hello World, ', 'Hello', ' Python')

大小写转换:

s = "Hello World"

print(s.upper())          # HELLO WORLD(全转大写)
print(s.lower())          # hello world(全转小写)
print(s.swapcase())       # hELLO wORLD(大写变小写,小写变大写)
print(s.title())          # Hello World(每个词首字母大写)
print(s.capitalize())     # Hello world(首字母大写,其余小写)

去空格与对齐:

s = "  Hello World  "

print(s.strip())   # Hello World(去除两端空格)
print(s.lstrip())  # Hello World  (去除左端)
print(s.rstrip())  #   Hello World(去除右端)

# 去除指定字符
print("!!Hello!!".strip("!"))   # Hello
print("abHelloab".strip("ab"))  # Hello

# 填充对齐
print("Hello".ljust(10))  # Hello     (左对齐,填充右空格)
print("Hello".rjust(10))  #      Hello(右对齐,填充左空格)
print("Hello".center(10)) #   Hello   (居中对齐)
print("Hello".zfill(10))  # 00000Hello(零填充)

判断方法(返回布尔值):

print("Hello123".isalnum())     # True(字母或数字)
print("Hello".isalpha())        # True(全是字母)
print("123".isdigit())          # True(全是数字)
print("123".isnumeric())        # True(Unicode数字)
print("123.5".isdecimal())      # False(小数点)
print("hello".islower())        # True(全小写)
print("HELLO".isupper())        # True(全大写)
print("Hello World".istitle())  # True(每个词首字母大写)
print("   ".isspace())           # True(全是空格)
print("Hello".startswith("He")) # True(以...开头)
print("Hello".endswith("lo"))    # True(以...结尾)

1.4 字符串分割与拼接

s = "apple, banana, orange, grape"

# split:分割(返回列表)
parts = s.split(", ")
print(parts)  # ['apple', 'banana', 'orange', 'grape']

# rsplit:从右向左分割(maxsplit次)
print(s.rsplit(", ", 1))  # ['apple, banana, orange', 'grape']

# splitlines:按换行符分割
text = "Line1\nLine2\r\nLine3"
print(text.splitlines())  # ['Line1', 'Line2', 'Line3']

# partition/rpartition
url = "https://blog.uuworld.cn"
print(url.partition("://"))  # ('https', '://', 'blog.uuworld.cn')

# join:拼接(最常用)
fruits = ["apple", "banana", "orange"]
print(", ".join(fruits))  # apple, banana, orange

# 实际应用:文件路径拼接
import os
path = os.path.join("home", "user", "docs", "file.txt")
print(path)  # home/user/docs/file.txt

1.5 f-string 格式化(Python 3.6+,重点)

name = "小明"
age = 18
score = 95.567

# 基本用法
print(f"姓名:{name},年龄:{age}")
# 输出:姓名:小明,年龄:18

# 表达式
print(f"10年后年龄:{age + 10}")
# 输出:10年后年龄:28

# 格式说明符
print(f"分数:{score:.2f}")       # 分数:95.57
print(f"分数:{score:8.2f}")    #     95.57(总宽度8右对齐)
print(f"百分比:{0.856:.1%}")   # 百分比:85.6%
print(f"科学计数:{1234567:.2e}") # 1.23e+06

# Python 3.8+ 调试语法(重要!)
x = 10
y = 20
print(f"{x=}, {y=}, {x+y=}")
# 输出:x=10, y=20, x+y=30

1.6 字符串编码

# 字符串与字节串转换
s = "Hello世界"
b = s.encode("utf-8")       # 字符串 -> 字节
print(b)  # b'Hello\xe4\xb8\x96\xe7\x95\x8c'
print(len(b))  # 13(UTF-8中文字占3字节)

# 字节转回字符串
s2 = b.decode("utf-8")
print(s2)  # Hello世界

# ASCII 转数字
print(ord("A"))  # 65
print(chr(65))   # A

二、背诵版

不可变 → 一切修改返回新字符串 切片 → s[start:end:step],step负数逆序 strip()去空格 → lstrip/rstrip split()分割 → join()拼接 replace()替换 → count()统计 upper/lower/title → 大小写转换 f-string → f"{x=}" 调试语法(Python 3.8+) format → "{:.2f}".format(x) encode → decode(UTF-8中文3字节)

三、考前记忆

方法 功能 示例结果
s.upper()/lower() 大小写 "Hello".upper()"HELLO"
s.strip() 去两端空格 " hi ".strip()"hi"
s.split() 分割为列表 "a,b".split(",")["a","b"]
",".join(lst) 列表拼接 ",".join(["a","b"])"a,b"
s.find(sub) 查找位置 "abc".find("b")1
s.replace() 替换 "aab".replace("a","c")"ccb"
s[start:end] 切片 "hello"[1:4]"ell"
f"{x=}" 调试f串 x=10 → "x=10"(3.8+)

四、测试题

1. 单选题: "Hello".replace("l", "x") 的结果是?

  • A. "Hexlo"
  • B. "Hexxo"
  • C. "Hello"
  • D. 报错

2. 单选题: 关于字符串的说法,正确的是?

  • A. 字符串可变,可以直接修改
  • B. "hello"[::-1] 得到 "olleh"
  • C. split()join() 作用相同
  • D. strip() 只去除左端空格

3. 判断题: Python 3.8 新增的 f"{x=}" 语法可以同时输出变量名和值。

4. 填空题: "hello world".split("o") 的结果是 ______。

5. 简答题: 说明 s.find("x")s.index("x") 的区别。

6. 代码题: 用一句话统计字符串 "ababa""ab" 出现的次数。

  1. Breplace 替换所有匹配)
  2. B[::-1] 步长-1 表示逆序)
  3. ["hell", " w", "rld"]
  4. find() 找不到返回 -1,不报错;index() 找不到会抛 ValueError 异常
  5. "ababa".count("ab") → 2