大家好,字符串是Python中使用频率最高的数据类型之一。无论是处理用户输入、解析文本文件,还是生成日志信息,都离不开它。这篇文章我们将系统性地学习字符串的七个核心方面,每个部分都配有代码示例,方便理解和查阅。
一、定义
字符串是由字符组成的序列,用引号括起来表示。
定义方式
# 单引号 name = '张三' # 双引号 city = "北京" # 三引号(支持多行) desc = """这是一段 多行文本 可以换行写""" # 三单引号同样支持多行 content = '''也是 多行文本'''空字符串
empty1 = "" empty2 = '' empty3 = str() # 使用 str() 构造方法单引号和双引号在功能上完全等价,选择哪种主要看字符串内容是否包含引号:
# 字符串包含单引号,外层用双引号 msg1 = "I'm a student" # 字符串包含双引号,外层用单引号 msg2 = '他说:"你好"' # 或者使用转义符 msg3 = 'I\'m a student'二、转义
转义字符用来表示一些特殊字符,以反斜杠\开头。
常用转义字符
| 转义符 | 含义 |
|---|---|
\' | 单引号 |
\" | 双引号 |
\\ | 反斜杠本身 |
\n | 换行符 |
\t | 制表符(Tab键) |
\r | 回车符 |
\b | 退格符 |
# 换行 print("第一行\n第二行") # 输出: # 第一行 # 第二行 # 制表符 print("姓名\t年龄\t城市") print("张三\t25\t北京") # 路径中的反斜杠需要转义 path = "C:\\Users\\Documents\\file.txt" # 或者使用原始字符串(推荐) path = r"C:\Users\Documents\file.txt"原始字符串
在字符串前加r,可以使字符串中的反斜杠不被解释为转义字符:
# 普通字符串 s1 = "C:\new\test" # \n 会被解释为换行 # 原始字符串 s2 = r"C:\new\test" # 原样输出 C:\new\test原始字符串在写正则表达式、文件路径时非常实用。
三、格式化方法
格式化是指将变量值嵌入到字符串中,Python提供了多种方式。
1.%格式化(旧式)
name = "张三" age = 25 print("我叫%s,今年%d岁" % (name, age)) # 我叫张三,今年25岁常用占位符:%s字符串、%d整数、%f浮点数。
2.format()方法
name = "张三" age = 25 # 按位置 print("我叫{},今年{}岁".format(name, age)) # 按索引 print("我叫{1},今年{0}岁".format(age, name)) # 按变量名 print("我叫{name},今年{age}岁".format(name=name, age=age))3. f-string(推荐,Python 3.6+)
name = "张三" age = 25 print(f"我叫{name},今年{age}岁") # 我叫张三,今年25岁f-string 还可以嵌入表达式:
x, y = 3, 5 print(f"{x} + {y} = {x + y}") # 3 + 5 = 8 price = 12.345 print(f"价格:{price:.2f}元") # 价格:12.35元f-string 是目前最推荐的格式化方式,可读性最好,性能也最高。
四、索引
字符串中的每个字符都有一个位置编号,可以通过索引来访问。
索引规则
正向索引:从0开始,从左到右
负向索引:从-1开始,从右到左
s = "Python" # 正向索引 print(s[0]) # P print(s[3]) # h print(s[5]) # n # 负向索引 print(s[-1]) # n print(s[-3]) # h索引对应关系
| 字符 | P | y | t | h | o | n |
|---|---|---|---|---|---|---|
| 正向 | 0 | 1 | 2 | 3 | 4 | 5 |
| 负向 | -6 | -5 | -4 | -3 | -2 | -1 |
索引越界
使用索引时,如果超出范围会报错:
s = "Python" # print(s[10]) # IndexError: string index out of range字符串是不可变类型,不能通过索引修改字符:
s = "Python" # s[0] = "J" # TypeError: 'str' object does not support item assignment五、切片
切片是从字符串中截取子串的操作,语法为[start:end:step]。
基本语法
s = "Hello, World!" # 截取一段 print(s[0:5]) # Hello (包含索引0,不包含索引5) print(s[7:12]) # World (包含索引7,不包含索引12) # 省略开始或结束 print(s[:5]) # Hello (从开头到索引4) print(s[7:]) # World! (从索引7到末尾) print(s[:]) # Hello, World! (全部) # 负索引切片 print(s[-6:-1]) # World (从倒数第6到倒数第2)步长
s = "abcdefghij" print(s[::2]) # acegi (从开头到末尾,每2个取1个) print(s[1::2]) # bdfhj (从索引1开始,每2个取1个) print(s[::-1]) # jihgfedcba (反转字符串)切片的特点
左闭右开:包含
start,不包含end容错性好:索引超出范围不会报错,只返回能取到的部分
s = "abc" print(s[0:10]) # abc (不会报错) print(s[10:20]) # '' (返回空字符串)六、遍历
遍历字符串的三种常用方式。
1. 直接遍历字符
s = "Python" for char in s: print(char) # 输出:P y t h o n (每行一个)2. 通过索引遍历
s = "Python" for i in range(len(s)): print(s[i])3.enumerate()同时获取索引和值
s = "Python" for index, char in enumerate(s): print(f"索引{index}:{char}") # 索引0:P # 索引1:y # 索引2:t # 索引3:h # 索引4:o # 索引5:n4. 判断字符类型
遍历时经常配合字符判断方法:
s = "Hello123" for char in s: if char.isdigit(): print(f"{char} 是数字") elif char.isalpha(): print(f"{char} 是字母")七、常用方法
字符串提供了大量内置方法,这里按功能分类整理。
1. 大小写转换
| 方法 | 说明 | 示例 |
|---|---|---|
upper() | 全部转大写 | "hello".upper()→"HELLO" |
lower() | 全部转小写 | "HELLO".lower()→"hello" |
capitalize() | 首字母大写 | "hello".capitalize()→"Hello" |
title() | 每个单词首字母大写 | "hello world".title()→"Hello World" |
swapcase() | 大小写互换 | "Hello".swapcase()→"hELLO" |
text = "python is FUN" print(text.upper()) # PYTHON IS FUN print(text.lower()) # python is fun print(text.capitalize()) # Python is fun2. 去除空白
| 方法 | 说明 |
|---|---|
strip() | 去除两端空白字符(空格、换行、制表符) |
lstrip() | 去除左端空白 |
rstrip() | 去除右端空白 |
text = " hello \n" print(text.strip()) # "hello" print(text.lstrip()) # "hello \n" print(text.rstrip()) # " hello"也可以指定要去除的字符:
text = "!!!hello!!!" print(text.strip("!")) # "hello"3. 查找与判断
| 方法 | 说明 |
|---|---|
find(sub) | 返回第一个匹配的子串起始索引,找不到返回 -1 |
index(sub) | 与find相同,但找不到会抛出异常 |
rfind(sub) | 从右向左查找 |
startswith(prefix) | 是否以指定前缀开头 |
endswith(suffix) | 是否以指定后缀结尾 |
count(sub) | 统计子串出现次数 |
s = "hello world hello" print(s.find("world")) # 6 print(s.find("python")) # -1 print(s.index("world")) # 6 # print(s.index("python")) # ValueError print(s.startswith("hello")) # True print(s.endswith("hello")) # True print(s.count("hello")) # 24. 拆分与拼接
| 方法 | 说明 |
|---|---|
split(sep) | 按分隔符拆分成列表 |
rsplit(sep) | 从右向左拆分 |
splitlines() | 按换行符拆分 |
join(iterable) | 将可迭代对象拼接成字符串 |
# split data = "apple,banana,orange" result = data.split(",") print(result) # ['apple', 'banana', 'orange'] # split 可以指定最大拆分次数 data = "a,b,c,d" print(data.split(",", 2)) # ['a', 'b', 'c,d'] # splitlines text = "第一行\n第二行\n第三行" print(text.splitlines()) # ['第一行', '第二行', '第三行'] # join items = ['a', 'b', 'c'] print("-".join(items)) # 'a-b-c'5. 替换
| 方法 | 说明 |
|---|---|
replace(old, new, count) | 替换子串,可指定替换次数 |
s = "hello world hello" print(s.replace("hello", "hi")) # hi world hi print(s.replace("hello", "hi", 1)) # hi world hello6. 对齐与填充
| 方法 | 说明 |
|---|---|
center(width, fillchar) | 居中 |
ljust(width, fillchar) | 左对齐 |
rjust(width, fillchar) | 右对齐 |
zfill(width) | 右对齐,用0填充 |
s = "hello" print(s.center(11, "*")) # "***hello***" print(s.ljust(10, "-")) # "hello-----" print(s.rjust(10, "-")) # "-----hello" print(s.zfill(10)) # "00000hello"7. 判断类型
| 方法 | 说明 |
|---|---|
isalpha() | 是否全是字母 |
isdigit() | 是否全是数字 |
isalnum() | 是否全是字母或数字 |
isspace() | 是否全是空白字符 |
islower() | 是否全是小写 |
isupper() | 是否全是大写 |
istitle() | 是否符合标题格式 |
print("hello".isalpha()) # True print("123".isdigit()) # True print("hello123".isalnum()) # True print(" ".isspace()) # True print("Hello".istitle()) # True八、总结
字符串在Python中占据重要地位,掌握好以下几个维度即可应对绝大多数场景:
| 知识点 | 核心要点 |
|---|---|
| 定义 | 单引号、双引号、三引号 |
| 转义 | \n、\t、\\,原始字符串r"" |
| 格式化 | %、format()、f-string(推荐) |
| 索引 | 正向从0开始,负向从-1开始 |
| 切片 | [start:end:step],左闭右开 |
| 遍历 | for、range、enumerate() |
| 常用方法 | 大小写、去空白、查找、拆分拼接、替换等 |
字符串的各个方法不需要死记硬背,多写代码自然就熟悉了。如果遇到不记得的方法,可以用dir(str)查看所有方法,或者用help(str.method)查看详细说明。
如果觉得这篇内容对你有帮助,欢迎收藏和分享。