↵
🎯 学习目标
深入掌握Python字符串的创建方式,理解正向和反向索引机制,熟练使用切片操作提取子字符串,为后续文本处理打下坚实基础!
📖 导语
在前面的学习中,我们已经掌握了Python的数字类型。但在实际编程中,字符串才是使用最频繁的数据类型之一。
无论是处理用户输入、读取文件内容、网络数据传输,还是生成报告、日志记录,都离不开字符串操作。据统计,在实际项目中,字符串操作占据了代码的30%以上!
今天,我们将深入学习Python字符串的核心知识:如何创建字符串?如何访问字符串中的字符?如何截取子字符串?这些都是每个Python程序员必须掌握的基本功。
一、字符串的创建
1.1 使用引号创建字符串
Python中可以使用三种引号创建字符串:
单引号字符串:
name = Alice
city = 北京
print(name) 输出: Alice
双引号字符串:
message = Hello World
greeting = 你好,Python!
print(message) 输出: Hello World
三引号字符串(多行):
poem = 床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。
print(poem)
1.2 引号的选择技巧
当字符串中包含某种引号时,可以使用另一种引号来包裹:
**字符串中包含单引号:**使用双引号包裹
sentence = It is a nice day today!
**字符串中包含双引号:**使用单引号包裹
quote = He said Hello to me.
**使用转义字符:**在引号前加反斜杠
text = It is a great day!
1.3 空字符串与空白字符串
**空字符串:**不包含任何字符,长度为0
empty = 空字符串
print(len(empty)) 输出: 0
print(bool(empty)) 输出: False
**空白字符串:**包含空格、制表符或换行符,长度不为0
spaces = 三个空格
print(len(spaces)) 输出: 3
使用str()函数创建字符串:
num_str = str(123)
float_str = str(3.14)
bool_str = str(True)
print(num_str) 输出: 123
print(float_str) 输出: 3.14
print(bool_str) 输出: True
二、字符串的索引
2.1 什么是索引
字符串中的每个字符都有一个编号,称为索引(index)。Python的索引从0开始,这意味着第一个字符的索引是0,第二个是1,以此类推。
例如字符串 "Python":
| 字符 | P | y | t | h | o | n |
| 正向索引 | 0 | 1 | 2 | 3 | 4 | 5 |
| 反向索引 | -6 | -5 | -4 | -3 | -2 | -1 |
|---|
2.2 正向索引
使用正数索引从字符串开头访问字符:
s = Python
print(s[0]) 输出: P(第一个字符)
print(s[1]) 输出: y(第二个字符)
print(s[5]) 输出: n(第六个字符)
2.3 反向索引
使用负数索引从字符串末尾访问字符,-1表示最后一个字符:
s = Python
print(s[-1]) 输出: n(最后一个字符)
print(s[-2]) 输出: o(倒数第二个字符)
print(s[-6]) 输出: P(第一个字符)
2.4 索引越界错误
如果索引超出范围,Python会抛出IndexError:
s = Hi
print(s[5]) 错误!IndexError: string index out of range
**如何避免越界?**使用len()函数先获取长度:
s = Hello World
length = len(s) 输出: 11
最后一个字符的索引 = length - 1 = 10
2.5 获取字符串长度
使用len()函数获取字符串长度:
s = Hello World
print(len(s)) 输出: 11(包含空格)
empty =
print(len(empty)) 输出: 0
**实战技巧:**获取最后一个字符
s = Python
last_char = s[len(s) - 1] 传统方法
last_char = s[-1] 推荐方法(更简洁)
三、字符串的切片
3.1 什么是切片
**切片(Slicing)**用于获取字符串的一部分(子字符串)。切片操作非常强大且灵活,是Python中处理字符串的核心技巧之一。
**基本语法:**string[start:end:step]
| 参数 | 说明 | 默认值 |
|---|---|---|
| start | 起始索引(包含) | 0 |
| end | 结束索引(不包含) | 字符串长度 |
| step | 步长(每隔几个字符取一个) | 1 |
3.2 基本切片操作
s = Hello World
print(s[0:5]) 输出: Hello(索引0到4)
print(s[6:11]) 输出: World(索引6到10)
print(s[0:11]) 输出: Hello World(整个字符串)
3.3 省略start或end
**省略start:**从字符串开头开始
s = Hello World
print(s[:5]) 输出: Hello(等同于s[0:5])
**省略end:**到字符串末尾结束
print(s[6:]) 输出: World(等同于s[6:11])
**同时省略:**复制整个字符串
print(s[:]) 输出: Hello World(创建副本)
3.4 使用步长
step表示每隔几个字符取一个:
s = abcdefghij
print(s[::2]) 输出: acegj(每隔一个字符)
print(s[1::2]) 输出: bdfh(从索引1开始,每隔一个)
print(s[::3]) 输出: adgj(每隔两个字符)
3.5 反转字符串
使用负数步长可以反转字符串:
s = Python
print(s[::-1]) 输出: nohtyP(反转整个字符串)
print(s[5:1:-1]) 输出: noht(从索引5到2,反向)
print(s[::-2]) 输出: nhy(反转后每隔一个)
3.6 切片的优势:不会越界
与索引不同,切片不会越界,超出范围会自动处理:
s = Hi
print(s[0:100]) 输出: Hi(不会报错,自动截断)
print(s[5:10]) 输出: (空字符串,不会报错)
print(s[-100:100]) 输出: Hi(不会报错)
3.7 切片实战示例
示例1:提取文件名和扩展名
filename = document.txt
name = filename[:-4] 输出: document
extension = filename[-3:] 输出: txt
示例2:提取日期中的年月日
date = 2026-04-27
year = date[:4] 输出: 2026
month = date[5:7] 输出: 04
day = date[8:] 输出: 27
四、字符串的基本方法
4.1 大小写转换
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(大小写互换)
4.2 查找和替换
s = Hello World, Hello Python
查找子串:
print(s.find(Hello)) 输出: 0(返回第一次出现的索引)
print(s.find(Hello, 5)) 输出: 13(从索引5开始查找)
print(s.rfind(Hello)) 输出: 13(从右边开始查找)
统计出现次数:
print(s.count(Hello)) 输出: 2
print(s.count(l)) 输出: 4
替换子串:
print(s.replace(Hello, Hi)) 输出: Hi World, Hi Python
print(s.replace(Hello, Hi, 1)) 输出: Hi World, Hello Python(只替换1次)
4.3 去除空白字符
s = Hello World
print(s.strip()) 输出: Hello World(去除两端空白)
print(s.lstrip()) 输出: Hello World (去除左边空白)
print(s.rstrip()) 输出: Hello World(去除右边空白)
去除指定字符:
s2 = xxHello Worldxx
print(s2.strip(x)) 输出: Hello World
s3 = ###Python###
print(s3.strip(#)) 输出: Python
4.4 分割和连接
s = apple,banana,orange
分割字符串:
fruits = s.split(,)
print(fruits) 输出: [apple, banana, orange](返回列表)
指定最大分割次数:
s2 = a,b,c,d,e
print(s2.split(,, 2)) 输出: [a, b, c,d,e]
连接字符串:
fruits = [apple, banana, orange]
new_s = -.join(fruits)
print(new_s) 输出: apple-banana-orange
sentence = .join(fruits)
print(sentence) 输出: apple banana orange
4.5 判断方法
s = Hello123
print(s.startswith(Hello)) 输出: True(是否以某字符串开头)
print(s.endswith(123)) 输出: True(是否以某字符串结尾)
print(s.isalpha()) 输出: False(是否全是字母)
print(s.isdigit()) 输出: False(是否全是数字)
print(s.isalnum()) 输出: True(是否全是字母或数字)
print(s.isspace()) 输出: False(是否全是空白字符)
更多判断方法:
print(HELLO.isupper()) 输出: True(是否全大写)
print(hello.islower()) 输出: True(是否全小写)
print(Hello World.istitle()) 输出: True(是否标题格式)
五、字符串的不可变性
5.1 什么是不可变性
在Python中,字符串是**不可变(Immutable)**类型,这意味着一旦创建,字符串的内容就不能被修改。任何对字符串的"修改"操作实际上都是创建了一个新的字符串。
s = Hello
s[0] = h 错误!TypeError
**正确的做法:**创建新字符串
s = h + s[1:]
print(s) 输出: hello
5.2 不可变性的优点
**1. 安全性:**字符串不会被意外修改,数据更加安全
**2. 哈希性:**可作为字典的键(可哈希)
**3. 共享性:**相同的字符串可以共享存储,节省内存
**4. 线程安全:**多线程环境下不需要同步
5.3 修改字符串的正确方式
由于字符串不可变,"修改"实际上是创建新字符串:
s = Hello World
替换子串:
s = s.replace(World, Python)
print(s) 输出: Hello Python
拼接字符串:
s = s + !
print(s) 输出: Hello Python!
使用join()高效拼接:
words = [Hello, Python, World]
sentence = .join(words)
print(sentence) 输出: Hello Python World
避免使用+进行大量拼接:
result =
for i in range(1000):
result += str(i) 效率低!
推荐:
parts = []
for i in range(1000):
parts.append(str(i))
result = .join(parts) 效率高!
六、字符串格式化
6.1 使用 % 格式化(旧式)
这是Python早期的格式化方式,类似C语言的printf:
name = Alice
age = 20
print(My name is %s, I am %d years old % (name, age))
常用格式化符号:
| 符号 | 含义 | 示例 |
|---|---|---|
| %s | 字符串 | Hello |
| %d | 整数 | 42 |
| %f | 浮点数 | 3.14 |
| %.2f | 保留2位小数 | 3.14 |
| %x | 十六进制 | 2a |
6.2 使用 format() 方法
Python 2.6+引入的格式化方式,更加灵活:
name = Alice
age = 20
按位置:
print(My name is {}, I am {} years old.format(name, age))
按索引:
print(My name is {0}, I am {1} years old.format(name, age))
print(I am {1}, My name is {0}.format(name, age))
按关键字:
print(My name is {name}, I am {age} years old.format(name=Bob, age=25))
格式控制:
pi = 3.1415926
print({:.2f}.format(pi)) 输出: 3.14
print({:10}.format(pi)) 输出: 3.14(宽度10,右对齐)
print({:<10}.format(pi)) 输出: 3.14 (宽度10,左对齐)
print({:^10}.format(pi)) 输出: 3.14 (宽度10,居中)
6.3 使用 f-string(推荐,Python 3.6+)
f-string是Python 3.6+引入的格式化方式,语法最简洁,性能最好:
name = Alice
age = 20
print(fMy name is {name}, I am {age} years old)
在表达式中计算:
print(fNext year I will be {age + 1} years old)
print(fPi equals {3.14159:.2f})
格式化数字:
num = 1234567
print(f{num:,}) 输出: 1,234,567(千位分隔)
print(f{num:08d}) 输出: 01234567(补零填充)
percentage = 0.8567
print(f{percentage:.2%}) 输出: 85.67%
七、实战案例
7.1 邮箱验证器
验证邮箱格式的基本规则:
def validate_email(email):
if @ not in email:
return False, 邮箱必须包含@符号
parts = email.split(@)
if len(parts) != 2:
return False, 邮箱格式不正确
local, domain = parts
if not local or not domain:
return False, @前后不能为空
if . not in domain:
return False, 域名必须包含.
return True, 邮箱格式正确
print(validate_email(test@example.com))
print(validate_email(invalid-email))
7.2 回文判断器
判断字符串是否为回文(正读反读相同):
def is_palindrome(s):
去除空格并转为小写
s = s.lower().replace( , )
比较原字符串和反转后的字符串
return s == s[::-1]
print(is_palindrome(A man a plan a canal Panama)) True
print(is_palindrome(Hello)) False
print(is_palindrome(上海自来水来自海上)) True
7.3 密码强度检测器
评估密码的复杂程度:
def check_password_strength(password):
score = 0
remarks = []
if len(password) >= 8:
score += 1
else:
remarks.append(密码长度应至少8位)
if any(c.isupper() for c in password):
score += 1
else:
remarks.append(应包含大写字母)
if any(c.islower() for c in password):
score += 1
else:
remarks.append(应包含小写字母)
if any(c.isdigit() for c in password):
score += 1
else:
remarks.append(应包含数字)
if any(not c.isalnum() for c in password):
score += 1
else:
remarks.append(应包含特殊字符)
levels = [非常弱, 弱, 中等, 强, 非常强, 完美]
return levels[score], remarks
strength, tips = check_password_strength(Abc123!@#)
print(f密码强度:{strength})
if tips:
print(改进建议:, tips)
7.4 文本统计工具
统计文本的各种信息
7.5 姓名格式化工具
格式化姓名显示
7.6 敏感词过滤器
简单的文本内容过滤
八、小结
今天我们深入学习了Python字符串的核心知识:
✅ 字符串的创建:单引号、双引号、三引号的使用场景
✅ 字符串的索引:正向索引(从0开始)和反向索引(从-1开始)
✅ 字符串的切片:基本语法[start:end:step],灵活运用切片提取子串
✅ 字符串的方法:大小写转换、查找替换、去除空白、分割连接、判断方法
✅ 字符串的不可变性:理解不可变性的意义,掌握正确的修改方式
✅ 字符串格式化:%、format()、f-string三种格式化方式
✅ 实战案例:邮箱验证、回文判断、密码检测、文本统计、姓名格式化等
字符串是Python编程中最重要的数据类型之一,熟练掌握字符串操作是每个Python程序员的必修课。通过今天的学习,相信你已经掌握了字符串的核心技能,为后续的文本处理、数据分析、Web开发等打下了坚实的基础。
学习建议:
-
多动手实践,尝试用不同的方法解决同一个问题
-
熟记常用的字符串方法,提高编码效率
-
理解字符串的不可变性,避免常见的编程错误
-
优先使用f-string进行字符串格式化,代码更简洁
九、课后练习
练习1:基础索引和切片
给定字符串 s = Python Programming
-
获取第3个字符(索引为2)
-
获取最后3个字符
-
获取 Python 子串
-
将字符串反转
-
每隔一个字符取一个
练习2:字符串方法练习
给定字符串 s = Hello, World!
-
去除两端空白
-
转换为全大写
-
将 World 替换为 Python
-
按逗号分割成列表
-
判断是否以 Hello 开头
练习3:编写函数
编写一个函数 is_palindrome(s),接收一个字符串,如果是回文返回True,否则返回False。要求忽略大小写和空格。
练习4:文本处理
给定一段文本,统计以下信息:
-
有多少个句子(以。!?结尾)
-
有多少个单词(以空格分隔)
-
哪个字母出现次数最多(忽略大小写)
练习5:格式化输出
编写程序,接收用户输入的姓名、年龄、成绩,输出格式化的学生信息表,要求:
-
姓名左对齐,宽度15
-
年龄右对齐,宽度5
-
成绩保留2位小数,居中,宽度10
练习6:挑战题
编写一个函数,实现简单的Markdown解析器,将以下格式的文本转换为HTML:
-
标题 转换为 h1 标签
-
标题 转换为 h2 标签
-
**粗体** 转换为 b 标签
-
*斜体* 转换为 i 标签
十、下篇预告
第7篇:《Python字符串方法大全:常用操作一网打尽》
在下一篇中,我们将继续深入学习字符串的更多内容:
-
字符串编码与解码:ASCII、UTF-8、GBK等
-
正则表达式基础:re模块的使用
-
字符串的高级操作技巧
-
字符串性能优化建议
-
更多实战案例和项目
敬请期待!
📌 系列文章目录:点击关注,持续更新中...
如果觉得有帮助,请点赞 👍 + 收藏 ⭐ + 关注 ❤️
你的支持是我持续创作的动力!
本文为本系列第6篇,带你从零基础到Python实战!