字符串是Python中最常用的数据类型之一。今天我们来讲讲字符串的核心操作。
一、字符串的创建
1.Python中创建字符串非常简单,用引号来创建。
python
# 单引号、双引号、三引号
s1 = '你好'
s2 = "世界"
s3 = """多行
字符串"""
print(s1, s2)
print(s3)

单引号 ( ' )和双引号(" )完全等价,三引号('' '' '')可以创建多行字符串。
2.如果字符串中包含引号,可以用另一种引号包围,或者用转义字符\。
python
# 转义字符示例
s4 = 'I\'m a student' # 用\'表示单引号
s5 = "路径:C:\\Users\\Test" # \\表示反斜杠
s6 = r"路径:C:\Users\Test" # 原始字符串,r前缀让转义失效
print(s4)
print(s5)
print(s6)

解释 :\是转义字符,r前缀创建原始字符串,常用于正则表达式和文件路径。
关键点:原始字符串适用于不需要转义的场合,代码更简洁。
二、字符串切片操作
切片是字符串的核心操作,语法为:字符串[开始:结束:步长]
1.基础切片
python
s = "Python编程"
# 基础切片
print(s[0:6]) # 从0开始,到6结束(不包含6)
print(s[:6]) # 省略开始,默认为0
print(s[6:]) # 省略结束,默认为末尾
print(s[:]) # 省略开始和结束,复制整个字符串

切片结果包含开始位置,不包含结束位置。省略开始或结束时使用默认值。
2.有步长的切片
步长默认为1,可以是负数,表示反向切片。
python
# 步长应用
print(s[::2]) # 步长为2,隔一个取一个
print(s[::-1]) # 步长为-1,字符串反转
print(s[-2:]) # 负数索引,从右往左数

解释:正数索引从0开始,负数索引从-1开始(最右边)。步长为负时,字符串反转。
关键点:负数索引非常实用,-1代表最后一个字符,-2代表倒数第二个。
三、字符串的增删改查
1. 增加字符串
python
# 方法一:+ 运算符(连接)
s1 = "Hello"
s2 = "World"
result = s1 + " " + s2
print(result)
# 方法二:join() 方法
words = ["Python", "is", "awesome"]
sentence = " ".join(words)
print(sentence)
# join效率更高,尤其适合连接多个字符串

解释 :+适合少量字符串连接,join()方法效率更高,特别适合连接列表中的多个字符串。
关键点 :join()前面的字符串是连接符,可以是空格、逗号等任意字符。
2. 删除和修改字符串
python
s = " Hello Python "
# 去除空白字符
print(s.strip()) # 去除两边空格
print(s.lstrip()) # 去除左边空格
print(s.rstrip()) # 去除右边空格
# 删除特定内容(用replace替换为空)
email = "test@example.com"
print(email.replace("@", "")) # 删除@符号

解释 :strip()系列方法用于去除两端字符(默认是空格)。replace()可以替换或删除字符。
关键点:字符串不可变,这些方法都返回新字符串,原字符串不变。
3. 查询字符串
python
s = "Python is powerful"
# 通过索引访问
print(s[0]) # 第一个字符
# 查找子串位置
print(s.find("is")) # 找到返回索引
print(s.find("Java")) # 找不到返回-1
print(s.index("is")) # 找到返回索引
# 判断子串是否存在
print("is" in s) # True
print("Java" not in s) # True
# 统计出现次数
print(s.count("o")) # 统计字母o出现次数

解释 :find()找不到返回-1(推荐),index()找不到会报错。in运算符判断是否存在最简洁。
关键点 :查询操作是安全的,不会改变原字符串。find()比index()更安全,避免程序崩溃。
四、字符串格式化技巧
1. f-string(最推荐,Python 3.6+)
python
name = "小明"
age = 18
score = 95.5
# 基本用法
print(f"{name}今年{age}岁,考了{score}分")
# 格式化数字
print(f"π约等于{3.14159:.2f}") # 保留2位小数
print(f"通过率:{0.856:.1%}") # 百分比格式
print(f"学号:{101:05d}") # 补零到5位

解释 :f-string在字符串前加f,用{}包裹变量,支持表达式计算和格式控制。
关键点:f-string可读性最好,效率最高,是Python 3.6+的首选方式。
2. format()方法
python
# 按位置
print("{}今年{}岁".format(name, age))
# 按名称
print("{n}的成绩是{s}分".format(n=name, s=score))
# 格式化
print("π约等于{:.2f}".format(3.14159))

解释 :format()通过{}占位,可以按位置或名称填充,兼容性最好。
关键点 :format()支持Python 2.7和3.x,适合需要兼容旧版本的项目。
3. %格式化(旧式,了解即可)
python
print("%s今年%d岁" % (name, age))
print("π约等于%.2f" % 3.14159)

解释 :类似C语言的printf风格,使用%s、%d等占位符。
关键点:这种写法较老旧,新项目建议使用f-string。
五、其他常用方法
python
s = "Python String Methods"
# 大小写转换
print(s.lower()) # 全小写
print(s.upper()) # 全大写
print(s.title()) # 首字母大写
# 判断方法
print(s.startswith("Py")) # 是否以Py开头
print(s.endswith("ods")) # 是否以ods结尾
print("123".isdigit()) # 是否全是数字
print("abc".isalpha()) # 是否全是字母
# 分割与合并
words = s.split() # 按空格分割
print(words)
new_s = "-".join(words) # 用-连接
print(new_s)

解释 :大小写转换常用于不区分大小写的比较。split()默认按空白字符分割。判断方法常用于数据验证。
关键点 :split()如果不传参数,会自动处理多个空格和制表符,非常智能。
六、重要特性:字符串不可变
python
s = "Python"
print(id(s)) # 查看内存地址
s = s + "编程"
print(id(s)) # 内存地址变了
# 原来的"Python"字符串还在内存中,只是变量s指向了新的字符串

解释:字符串一旦创建就不能修改。看起来是"修改"的操作,实际上是创建了新字符串。
关键点 :频繁修改字符串(如在循环中用+连接)会影响性能,这种情况下建议使用列表和join()。
总结
- 创建 :单双引号等价,三引号支持多行,
\转义,r创建原始字符串 - 切片 :
[开始:结束:步长],左闭右开,支持负数索引 - 增删改查 :
join()比+高效,find()比index()安全,查询用in最简洁 - 格式化 :优先使用f-string,简洁直观效率高
- 不可变:字符串不能修改,"修改"操作会创建新字符串
(附录)Python字符串操作速查表
表1:字符串创建与访问
|--------|-------|--------------------|-----------------|----------------|
| 操作类型 | 语法/方法 | 示例代码 | 输出结果 | 关键点 |
| 创建 | 单/双引号 | s = "Python" | Python | 两者完全等价 |
| | 三引号 | s = """多行\n文本""" | 多行 文本 | 支持换行和保留格式 |
| | 原始字符串 | s = r"C:\test" | C:\test | r前缀取消转义,适合路径 |
| 切片 | 基本切片 | s[0:6] | Python | 左闭右开,含头不含尾 |
| | 省略写法 | s[:6] / s[6:] | Python / 编程 | 缺省起始=0,缺省结束=末尾 |
| | 步长切片 | s[::2] | Pto | 步长2,隔一个取一个 |
| | 反向切片 | s[::-1] | 码编nohtyP | 步长为负,字符串反转 |
表2:增删改查方法
|-------------------------|-------------------|--------------------------|-------------|-------------|
| 类别 | 方法/操作 | 示例代码 | 输出结果 | 关键点 |
| 增 | +连接 | "Hi" + " Python" | Hi Python | 少量连接方便,但效率低 |
| | join() | " ".join(["a","b"]) | a b | 连接列表高效,推荐! |
| 删/改 | replace() | s.replace("Py","Java") | Java | 替换内容,原字符串不变 |
| | strip() | " hi ".strip() | hi | 去两端空格/指定字符 |
| lstrip() / rstrip() | " hi ".rstrip() | hi | 仅去左端或右端 | |
| 查 | 索引访问 | s[0] | P | 获取单个字符 |
| | find() | s.find("is") | 7 | 找不到返回-1(安全) |
| | index() | s.index("is") | 7 | 找不到报错(不推荐) |
| | in判断 | "Py" in s | True | 最简洁的存在判断 |
| | count() | s.count("o") | 2 | 统计子串出现次数 |
表3:格式化方法对比
|--------------------|---------------------------------|------------|------------------|
| 方法 | 语法示例 | 输出结果 | 适用场景 |
| f-string (最推荐) | f"{name}考{score}分" | 小明考95.5分 | Python 3.6+,简洁高效 |
| | f"{pi:.2f}" | 3.14 | 支持数字格式化 |
| format() | "{}{}".format(a,b) | ab | Python 2.7+,兼容性好 |
| | "{n}:{s}".format(n="年龄",s=18) | 年龄:18 | 支持命名参数 |
| %格式化 | "%s:%d" % ("年龄",18) | 年龄:18 | 旧项目维护,了解即可 |
表4:其他常用方法
|-------------------------------|---------|-----------------------------|-----------------|
| 方法 | 作用 | 示例 | 输出 |
| lower() / upper() | 大小写转换 | "Python".upper() | PYTHON |
| title() / capitalize() | 首字母大写 | "hello world".title() | Hello World |
| startswith() / endswith() | 判断开头/结尾 | "test.py".endswith(".py") | True |
| isdigit() / isalpha() | 判断字符类型 | "123".isdigit() | True |
| split() | 分割字符串 | "a,b,c".split(",") | ['a','b','c'] |
| len() | 获取长度 | len("Python") | 6 |
表5:字符串核心特性
|----------|-------------|-----------------------|----------------------|
| 特性 | 说明 | 示例 | 关键点 |
| 不可变性 | 字符串一旦创建不能修改 | s = "a"; id(s) 地址改变 | 所有"修改"操作都返回新字符串 |
| 性能注意 | 循环中避免用+连接 | 用list存结果再用join() | 减少内存开销,提升速度 |
| 编码 | 默认Unicode | s = "中文" | Python3直接支持中文,无需特殊处理 |
建议记忆顺序
- 优先掌握 :f-string、
join()、find()、in判断、切片s[::-1] - 需要了解 :
format()、split()、strip()、replace() - 注意事项 :字符串不可变、循环内不用
+
一句话总结 :Python的字符串操作简单强大,记住f-string格式化 、join连接 、切片反转这三招,能解决我们80%的日常问题!