一、什么是字符串分割与连接?
- • 分割(split):将一个字符串按照指定的分隔符拆分成多个子串,结果通常是一个列表。
- • 连接(join):将一个可迭代对象中的多个字符串合并成一个新字符串,中间可以插入指定的分隔符。
这两个操作互为逆过程,是处理文本数据时最常用的技能之一。
# 分割
s = "apple,banana,orange"
fruits = s.split(",")
print(fruits) # ['apple', 'banana', 'orange']
# 连接
new_s = "-".join(fruits)
print(new_s) # "apple-banana-orange"
二、字符串分割方法
2.1 split() —— 按指定分隔符分割
split(sep=None, maxsplit=-1) 是 Python 中最常用的分割方法。
- •
sep:分隔符,可以是一个字符串。默认为 None,表示按任意空白字符(空格、换行、制表符等)分割,并且会忽略连续空白。 - •
maxsplit:最大分割次数,默认为 -1(即无限制)。如果指定 maxsplit,则最多分割成 maxsplit+1 个部分。
示例 1:默认按空白分割
text = "Hello World Python"
print(text.split()) # ['Hello', 'World', 'Python']
示例 2:指定分隔符
data = "apple,banana,orange"
print(data.split(",")) # ['apple', 'banana', 'orange']
示例 3:限制分割次数
s = "a,b,c,d,e"
print(s.split(",", 2)) # ['a', 'b', 'c,d,e'] 只分割前两个逗号
注意: 如果分隔符在字符串开头或结尾,结果中可能包含空字符串。
s = ",a,,b,"
print(s.split(",")) # ['', 'a', '', 'b', '']
2.2 rsplit() —— 从右侧开始分割
rsplit(sep=None, maxsplit=-1) 与 split() 类似,但从字符串的右侧开始分割。常用于处理路径或限制从右边分割的次数。
path = "/home/user/docs/file.txt"
# 从右边分割一次,获取目录和文件名
dir_part, file_part = path.rsplit("/", 1)
print(dir_part) # "/home/user/docs"
print(file_part) # "file.txt"
2.3 splitlines() —— 按行分割
splitlines([keepends]) 按换行符分割字符串,返回一个包含各行的列表。
- •
keepends:布尔值,默认为 False。如果为 True,则保留行尾的换行符。
text = "第一行\n第二行\r\n第三行"
print(text.splitlines()) # ['第一行', '第二行', '第三行']
print(text.splitlines(True)) # ['第一行\n', '第二行\r\n', '第三行']
2.4 partition() 和 rpartition() —— 分割为三部分
partition(sep) 在字符串中第一次出现分隔符的位置进行分割,返回一个三元组 (head, sep, tail)。如果找不到分隔符,则返回 (原字符串, '', '')。
s = "username:password"
print(s.partition(":")) # ('username', ':', 'password')
# 找不到分隔符
print(s.partition("=")) # ('username:password', '', '')
rpartition(sep) 是从右侧第一次出现的位置分割。
url = "https://www.example.com/index.html"
print(url.rpartition("/")) # ('https://www.example.com', '/', 'index.html')
这两个方法非常适合需要同时获取分隔符和两侧内容的场景,比如解析键值对。
三、字符串连接方法
3.1 join() —— 连接可迭代对象中的字符串
join() 是字符串的一个方法,语法为:分隔符.join(可迭代对象)。
- • 方法返回一个新字符串,将元素用指定的分隔符连接起来。
words = ["Hello", "World", "Python"]
s = " ".join(words)
print(s) # "Hello World Python"
# 用逗号连接
tags = ["python", "编程", "教程"]
print(",".join(tags)) # "python,编程,教程"
注意:join() 的性能远高于使用 + 在循环中拼接字符串,因为 join() 一次性分配内存。
3.2 使用 + 连接(不推荐用于大量拼接)
对于少量已知字符串,可以用 +:
s = "Hello" + " " + "World"# "Hello World"
但在循环中频繁使用 + 会导致性能下降(因为字符串不可变,每次都要创建新字符串)。
3.3 使用格式化方法间接连接
f-string、format() 等方法也可以用于拼接,但本质上还是格式化的范畴。
四、实战案例
案例1:解析 CSV 行
csv_line = "张三,25,北京"
fields = csv_line.split(",")
name, age, city = fields
print(f"姓名:{name},年龄:{age},城市:{city}")
案例2:将列表合并为逗号分隔的字符串
items = ["苹果", "香蕉", "橙子"]
result = ", ".join(items)
print(result) # "苹果, 香蕉, 橙子"
案例3:处理多行字符串(保留行号)
text = """第一行
第二行
第三行"""
lines = text.splitlines()
for i, line inenumerate(lines, 1):
print(f"{i}: {line}")
案例4:解析 URL 参数
url = "https://example.com/search?q=python&page=2&sort=desc"
query_part = url.split("?")[1] # 提取 ? 后面的部分
pairs = query_part.split("&") # 按 & 分割
params = {}
for pair in pairs:
key, value = pair.split("=")
params[key] = value
print(params) # {'q': 'python', 'page': '2', 'sort': 'desc'}
案例5:路径处理(使用 rsplit)
full_path = "/home/user/docs/report.txt"
folder, filename = full_path.rsplit("/", 1)
print(f"文件夹:{folder}") # /home/user/docs
print(f"文件名:{filename}") # report.txt
案例6:使用 partition 解析键值对
line = "name:张三"
key, sep, value = line.partition(":")
if sep:
print(f"键:{key},值:{value}")
else:
print("格式错误")
案例7:将列表中的数字转为字符串并用逗号连接
numbers = [1, 2, 3, 4]
# 需要先将数字转为字符串
str_numbers = [str(n) for n in numbers]
result = ", ".join(str_numbers)
print(result) # "1, 2, 3, 4"
案例8:去除多余空白并重组句子
sentence = "Python is awesome"
words = sentence.split() # 按空白分割,自动处理连续空格
clean_sentence = " ".join(words)
print(clean_sentence) # "Python is awesome"
五、注意事项与常见错误
- 1.
split() 默认行为:无参时按任意空白分割且忽略连续空白,与 split(' ') 不同,后者按单个空格分割且会保留空字符串。 - 2.
join() 的参数必须是字符串可迭代对象:如果包含非字符串,会抛出 TypeError。 - 3. 空字符串处理:
split 遇到连续分隔符会产生空字符串;join 对空列表返回空字符串。 - 4. 性能:在循环中拼接大量字符串应使用列表收集然后用
join,避免 +=。 - 5.
partition 与 split 的区别:partition 只分割一次且返回三元组,适合确定有分隔符的场景;split 可分割多次返回列表。 - 6. 不可变性:所有分割和连接方法都返回新字符串或列表,原字符串不变。
六、总结
| | |
split() | | |
rsplit() | | |
splitlines() | | |
partition() | | |
rpartition() | | |
join() | | |
掌握这些方法,就能在文本处理中游刃有余地拆分和重组字符串。无论是解析文件、处理用户输入,还是构建输出,它们都是不可或缺的工具。