news 2026/6/11 21:04:54

Python基础:字符串常用方法之分割与拼接

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python基础:字符串常用方法之分割与拼接

Python基础:字符串常用方法之分割与拼接

一、开篇:拆开和拼起来都很有用

上一篇我们学了字符串的查找与替换。今天要讲的两个操作——分割(split)拼接(join)——互为逆操作。一个把字符串按规则拆成列表,一个把列表按规则合回字符串。

⌨️ 分割和拼接在处理结构化文本时无处不在:解析CSV文件的一行数据、拆分URL路径、拼接SQL查询语句、格式化日志输出——几乎每个和文本打交道的程序都会用到它们。

二、split():把字符串拆成列表

2.1 基本用法

# 按空格分割(默认行为)text='Python Java Go Rust'result=text.split()print(result)# ['Python', 'Java', 'Go', 'Rust']# 按指定分隔符分割csv_line='小明,25,北京,工程师'fields=csv_line.split(',')print(fields)# ['小明', '25', '北京', '工程师']# 按换行符分割多行文本multiline='第一行\n第二行\n第三行'lines=multiline.split('\n')print(lines)# ['第一行', '第二行', '第三行']

2.2 限制分割次数(maxsplit)

text='a-b-c-d-e'# 不限制print(text.split('-'))# ['a', 'b', 'c', 'd', 'e']# 只分割1次print(text.split('-',1))# ['a', 'b-c-d-e']# 分割2次print(text.split('-',2))# ['a', 'b', 'c-d-e']# 从右边开始分割print(text.rsplit('-',2))# ['a-b-c', 'd', 'e']

💡 maxsplit的实用场景:解析"键值对"类数据时,只分割第一个分隔符:

# 解析HTTP头header='Content-Type: application/json; charset=utf-8'key,value=header.split(':',1)print(f'键:{key.strip()}')# 键: Content-Typeprint(f'值:{value.strip()}')# 值: application/json; charset=utf-8# 解析命令行参数command='user create --name 小明 --role admin'cmd,*args=command.split()# 或者更复杂的情况用partition

2.3 split() 的特殊行为

# 默认split()和split(' ')的行为不同!text='a b c d'# split()(无参数):将连续的空白符视为一个分隔符,自动去除首尾空白print(text.split())# ['a', 'b', 'c', 'd']# split(' ')(有参数):严格按照每个空格分割print(text.split(' '))# ['a', '', '', 'b', '', 'c', '', '', '', 'd']# 字符串首尾有分隔符时text=',a,b,c,'print(text.split(','))# ['', 'a', 'b', 'c', ''](首尾有空字符串)print([xforxintext.split(',')ifx])# ['a', 'b', 'c'](过滤空串)

⚠️ 一个常见的坑:split()vssplit(' ')

  • 'hello world'.split()['hello', 'world'](连续空格被合并)
  • 'hello world'.split(' ')['hello', '', 'world'](中间有空字符串)

2.4 splitlines():按行分割

text='第一行\n第二行\r\n第三行\n第四行'# splitlines()自动处理各种换行符lines=text.splitlines()print(lines)# ['第一行', '第二行', '第三行', '第四行']# splitlines(keepends=True):保留换行符lines_with_ends=text.splitlines(keepends=True)print(lines_with_ends)# ['第一行\n', '第二行\r\n', '第三行\n', '第四行']# 和split('\n')的对比# split('\n')不处理\r\n,可能留下\r

三、partition() 和 rpartition():一刀切三段

3.1 基本用法

partition()在第一次出现分隔符的位置把字符串切成三部分:(分隔符之前, 分隔符本身, 分隔符之后)。找不到分隔符时返回 (原字符串, ‘’, ‘’)。

# partition:分割为三部分text='Python@Java@Go'print(text.partition('@'))# ('Python', '@', 'Java@Go')# rpartition:从右边开始找分隔符print(text.rpartition('@'))# ('Python@Java', '@', 'Go')# 找不到分隔符时print(text.partition('#'))# ('Python@Java@Go', '', '')

3.2 partition() 比 split() 优雅的场景

# 场景一:解析URL的协议部分url='https://www.example.com/path?query=value'protocol,_,rest=url.partition('://')print(protocol)# httpsprint(rest)# www.example.com/path?query=value# 场景二:解析邮箱地址email='user@example.com'local_part,_,domain=email.partition('@')print(f'用户名:{local_part}')# 用户名: userprint(f'域名:{domain}')# 域名: example.com# 场景三:解析MySQL连接字符串conn_str='mysql://user:password@localhost:3306/dbname'# 切出协议protocol,_,rest=conn_str.partition('://')# 切出认证和服务器auth,_,server_db=rest.rpartition('@')user,_,password=auth.partition(':')server,_,dbname=server_db.partition('/')print(f'用户:{user}, 密码:{password}, 服务器:{server}, 数据库:{dbname}')

💡 何时用partition()而不是split()

  • 当你确定只需要切一次,并且可能需要保留分隔符时:用partition()
  • 当你需要切多次或不确定次数时:用split()

四、join():把列表拼成字符串

4.1 基本用法

join()的作用和split()相反——它把一个可迭代对象中的字符串拼接起来,中间插入分隔符。

# 基本拼接words=['Python','Java','Go','Rust']result=', '.join(words)print(result)# Python, Java, Go, Rust# 无分隔符拼接print(''.join(['a','b','c']))# abc# 用换行符拼接lines=['第一行','第二行','第三行']print('\n'.join(lines))# 用制表符拼接(生成TSV格式)print('\t'.join(['姓名','年龄','城市']))

⚠️join()要求所有元素都是字符串。如果有非字符串元素,会报TypeError

items=['项目',1,'测试',2]# '-'.join(items) # TypeError!# 需要先转换result='-'.join(str(item)foriteminitems)print(result)# 项目-1-测试-2

4.2 join() 的多种应用

# 构建SQL查询columns=['name','age','city']placeholders=', '.join(['%s']*len(columns))query=f'INSERT INTO users ({", ".join(columns)}) VALUES ({placeholders})'print(query)# INSERT INTO users (name, age, city) VALUES (%s, %s, %s)# 生成HTMLitems=['苹果','香蕉','橘子']html_list='<ul>\n'+'\n'.join(f' <li>{item}</li>'foriteminitems)+'\n</ul>'print(html_list)# 生成文件路径path_parts=['home','user','documents','report.pdf']path='/'.join(path_parts)print(path)# home/user/documents/report.pdf# 格式化输出表格data=[['小明','25','北京'],['小红','23','上海'],['小刚','26','广州'],]# 每行的列用 | 分隔forrowindata:print('| '+' | '.join(row)+' |')

4.3 join() 的性能优势

在循环中用+拼接字符串性能很差,而join()只需分配一次内存:

importtime words=['hello']*100000# 10万个字符串# 方法一:用 +(慢)start=time.perf_counter()result=''forwordinwords:result+=word elapsed_plus=time.perf_counter()-startprint(f'用 + 拼接:{elapsed_plus:.4f}秒')# 方法二:用 join(快)start=time.perf_counter()result=''.join(words)elapsed_join=time.perf_counter()-startprint(f'用 join:{elapsed_join:.4f}秒')# 时间差距可能是几十倍甚至上百倍!

五、split() 和 join() 的组合应用

5.1 文本格式转换

# CSV格式 → 固定宽度文本 → SQL INSERTcsv_data='小明,25,北京,工程师'# 拆开name,age,city,job=csv_data.split(',')# 重新组合sql=f"INSERT INTO users (name, age, city, job) VALUES ('{name}',{age}, '{city}', '{job}')"print(sql)# 日期格式转换:2024/05/30 → 2024-05-30date_slash='2024/05/30'date_dash='-'.join(date_slash.split('/'))print(date_dash)# 2024-05-30# 倒转单词顺序sentence='I love Python programming'words=sentence.split()reversed_sentence=' '.join(reversed(words))print(reversed_sentence)# programming Python love I

5.2 数据清理和标准化

# 清理多余的空白defnormalize_whitespace(text):"""将连续的空白字符统一为单个空格"""return' '.join(text.split())text='Hello world\t\tPython \n\n 编程'print(normalize_whitespace(text))# Hello world Python 编程# URL slug生成defslugify(text):"""将标题转为URL友好的slug格式"""# 转小写,替换空格为连字符,过滤非字母数字的字符slug='-'.join(text.lower().split())# 更复杂的实现可以用正则,但基本思路仍然是split+joinreturnslugprint(slugify('My First Blog Post'))# my-first-blog-post

5.3 矩阵/表格的转置

# 用split和join实现文本表格的行列转置table=['姓名,年龄,城市','小明,25,北京','小红,23,上海','小刚,26,广州',]# 每行按逗号分割rows=[row.split(',')forrowintable]# 转置(行列互换)transposed=list(zip(*rows))# 每列按逗号拼接回去result=[','.join(col)forcolintransposed]forlineinresult:print(line)# 输出:# 姓名,小明,小红,小刚# 年龄,25,23,26# 城市,北京,上海,广州

六、切割高级操作

6.1 多分隔符分割

Python的split()只支持单个分隔符。如果需要多个分隔符,有几种解决方案:

importre text='苹果,香蕉;橘子|葡萄 西瓜'# 方案一:多次replace + splitresult=text.replace(';',',').replace('|',',').replace(' ',',').split(',')print(result)# ['苹果', '香蕉', '橘子', '葡萄', '西瓜']# 方案二:用正则表达式(更灵活)result=re.split(r'[,;| ]',text)print(result)# ['苹果', '香蕉', '橘子', '葡萄', '西瓜']# 方案三:re.split保留分隔符result=re.split(r'([,;| ])',text)print(result)# ['苹果', ',', '香蕉', ';', '橘子', '|', '葡萄', ' ', '西瓜']

6.2 保留分隔符的分割

importre# 用re.split的分组捕获来保留分隔符text='Hello, World! How are you?'result=re.split(r'([,.!? ])',text)# 过滤空字符串result=[sforsinresultifsands!=' ']print(result)# ['Hello', ',', 'World', '!', 'How', 'are', 'you', '?']# 用在文本分句defsplit_sentences(text):"""按句末标点分割句子,保留标点符号"""importre parts=re.split(r'([。!?.!?])',text)sentences=[]foriinrange(0,len(parts)-1,2):sentences.append(parts[i]+parts[i+1])iflen(parts)%2==1andparts[-1]:sentences.append(parts[-1])returnsentences text='你好!今天天气不错。你吃饭了吗?'print(split_sentences(text))# ['你好!', '今天天气不错。', '你吃饭了吗?']

七、实战:CSV解析器

defparse_csv_line(line,delimiter=',',quote_char='"'):""" 解析CSV的一行(支持引号内的分隔符) 例如: 小明,"北京,朝阳区",25 → ['小明', '北京,朝阳区', '25'] """fields=[]current_field=''in_quotes=Falseforcharinline:ifchar==quote_char:in_quotes=notin_quoteselifchar==delimiterandnotin_quotes:fields.append(current_field)current_field=''else:current_field+=char fields.append(current_field)returnfields# 测试csv_line='小明,"北京,朝阳区",25,工程师'fields=parse_csv_line(csv_line)print(fields)# ['小明', '北京,朝阳区', '25', '工程师']# 标准CSV处理还是用csv模块importcsv line='小明,"北京,朝阳区",25,工程师'reader=csv.reader([line])print(next(reader))# ['小明', '北京,朝阳区', '25', '工程师']

八、性能对比与最佳实践

# split vs partition(只需要切一次时)text='key: value with many colons: extra data'# split(会扫描整个字符串)key,value=text.split(':',1)# 用了maxsplit=1还行# partition(找到第一个就停止,更高效)key,_,value=text.partition(':')# 拼接:join vs +=# 1. 少量拼接(<5个):+ 或 f-string 更简洁name='小明'greeting='你好,'+name+'!'# 或greeting=f'你好,{name}!'# 2. 列表拼接:joinwords=['Python','Java','Go','Rust']result=', '.join(words)# 3. 循环拼接:列表收集 + joinlines=[]foriinrange(1000):lines.append(f'第{i}行')result='\n'.join(lines)

九、本篇小结

✅ 分割与拼接的核心方法:

方法方向说明
split()字符串→列表按分隔符分割
rsplit()字符串→列表从右边开始分割
splitlines()字符串→列表按换行符分割
partition()字符串→三元组一刀切三段
rpartition()字符串→三元组从右边一刀切
join()列表→字符串用分隔符拼接

核心技巧:

  • 需要切多次用split(),只需切一次用partition()
  • 大量字符串拼接用join(),少量用+或 f-string
  • split()join()互为逆操作,经常搭配使用
  • 多分隔符分割用正则re.split()

📝 下一篇我们继续字符串方法之旅——大小写转换与判断方法。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/8 7:15:55

Simple Runtime Window Editor:终极游戏窗口调整与截图工具完全指南

Simple Runtime Window Editor&#xff1a;终极游戏窗口调整与截图工具完全指南 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE 你是否曾经为游戏窗口尺寸的限制而感到困扰&#xff1f;想要在窗口模式下获得全屏…

作者头像 李华
网站建设 2026/6/6 19:18:03

本地部署 DeepSeek 大模型:基于 Ollama 的极简实现教程

大家好&#xff01;最近一直在研究本地大模型部署&#xff0c;发现 Ollama 堪称 “本地大模型神器”—— 无需复杂的环境配置、不用手动处理依赖&#xff0c;几分钟就能把 DeepSeek 这类优秀的开源大模型跑在自己的电脑&#xff08;甚至虚拟机&#xff09;上。今天就把完整的部…

作者头像 李华
网站建设 2026/6/8 0:57:19

从零到处理器:Digital数字电路设计工具如何简化硬件学习曲线

从零到处理器&#xff1a;Digital数字电路设计工具如何简化硬件学习曲线 【免费下载链接】Digital A digital logic designer and circuit simulator. 项目地址: https://gitcode.com/gh_mirrors/di/Digital 想象一下&#xff0c;你正在学习数字电路设计&#xff0c;面对…

作者头像 李华
网站建设 2026/6/6 19:14:58

AIGS的方法论、四层架构与三大应用形态

一、AI 落地的三个真实困境困境一&#xff1a;模型碎片化。 同一种业务往往要在不同类型模型之间切换——有的场景用国内通用大模型&#xff0c;有的用国际通用大模型&#xff0c;有的用开源模型做私有化部署。年初对接一家主流厂商&#xff0c;到年底又要支持国产替代和开源部…

作者头像 李华
网站建设 2026/6/7 19:27:07

解密UE5数字人实时渲染架构:企业级智能交互解决方案实战指南

解密UE5数字人实时渲染架构&#xff1a;企业级智能交互解决方案实战指南 【免费下载链接】fay-ue5 可对接fay数字人的ue5工程 项目地址: https://gitcode.com/gh_mirrors/fa/fay-ue5 在实时渲染技术快速演进的时代&#xff0c;虚幻引擎5&#xff08;UE5&#xff09;凭借…

作者头像 李华