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

发布时间:2026/6/6 19:19:24

Python基础:字符串常用方法之分割与拼接 Python基础字符串常用方法之分割与拼接一、开篇拆开和拼起来都很有用上一篇我们学了字符串的查找与替换。今天要讲的两个操作——分割split和拼接join——互为逆操作。一个把字符串按规则拆成列表一个把列表按规则合回字符串。⌨️ 分割和拼接在处理结构化文本时无处不在解析CSV文件的一行数据、拆分URL路径、拼接SQL查询语句、格式化日志输出——几乎每个和文本打交道的程序都会用到它们。二、split()把字符串拆成列表2.1 基本用法# 按空格分割默认行为textPython Java Go Rustresulttext.split()print(result)# [Python, Java, Go, Rust]# 按指定分隔符分割csv_line小明,25,北京,工程师fieldscsv_line.split(,)print(fields)# [小明, 25, 北京, 工程师]# 按换行符分割多行文本multiline第一行\n第二行\n第三行linesmultiline.split(\n)print(lines)# [第一行, 第二行, 第三行]2.2 限制分割次数maxsplittexta-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头headerContent-Type: application/json; charsetutf-8key,valueheader.split(:,1)print(f键:{key.strip()})# 键: Content-Typeprint(f值:{value.strip()})# 值: application/json; charsetutf-8# 解析命令行参数commanduser create --name 小明 --role admincmd,*argscommand.split()# 或者更复杂的情况用partition2.3 split() 的特殊行为# 默认split()和split( )的行为不同texta 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()自动处理各种换行符linestext.splitlines()print(lines)# [第一行, 第二行, 第三行, 第四行]# splitlines(keependsTrue)保留换行符lines_with_endstext.splitlines(keependsTrue)print(lines_with_ends)# [第一行\n, 第二行\r\n, 第三行\n, 第四行]# 和split(\n)的对比# split(\n)不处理\r\n可能留下\r三、partition() 和 rpartition()一刀切三段3.1 基本用法partition()在第一次出现分隔符的位置把字符串切成三部分(分隔符之前, 分隔符本身, 分隔符之后)。找不到分隔符时返回 (原字符串, ‘’, ‘’)。# partition分割为三部分textPythonJavaGoprint(text.partition())# (Python, , JavaGo)# rpartition从右边开始找分隔符print(text.rpartition())# (PythonJava, , Go)# 找不到分隔符时print(text.partition(#))# (PythonJavaGo, , )3.2 partition() 比 split() 优雅的场景# 场景一解析URL的协议部分urlhttps://www.example.com/path?queryvalueprotocol,_,resturl.partition(://)print(protocol)# httpsprint(rest)# www.example.com/path?queryvalue# 场景二解析邮箱地址emailuserexample.comlocal_part,_,domainemail.partition()print(f用户名:{local_part})# 用户名: userprint(f域名:{domain})# 域名: example.com# 场景三解析MySQL连接字符串conn_strmysql://user:passwordlocalhost:3306/dbname# 切出协议protocol,_,restconn_str.partition(://)# 切出认证和服务器auth,_,server_dbrest.rpartition()user,_,passwordauth.partition(:)server,_,dbnameserver_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()要求所有元素都是字符串。如果有非字符串元素会报TypeErroritems[项目,1,测试,2]# -.join(items) # TypeError!# 需要先转换result-.join(str(item)foriteminitems)print(result)# 项目-1-测试-24.2 join() 的多种应用# 构建SQL查询columns[name,age,city]placeholders, .join([%s]*len(columns))queryfINSERT INTO users ({, .join(columns)}) VALUES ({placeholders})print(query)# INSERT INTO users (name, age, city) VALUES (%s, %s, %s)# 生成HTMLitems[苹果,香蕉,橘子]html_listul\n\n.join(f li{item}/liforiteminitems)\n/ulprint(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万个字符串# 方法一用 慢starttime.perf_counter()resultforwordinwords:resultword elapsed_plustime.perf_counter()-startprint(f用 拼接{elapsed_plus:.4f}秒)# 方法二用 join快starttime.perf_counter()result.join(words)elapsed_jointime.perf_counter()-startprint(f用 join{elapsed_join:.4f}秒)# 时间差距可能是几十倍甚至上百倍五、split() 和 join() 的组合应用5.1 文本格式转换# CSV格式 → 固定宽度文本 → SQL INSERTcsv_data小明,25,北京,工程师# 拆开name,age,city,jobcsv_data.split(,)# 重新组合sqlfINSERT INTO users (name, age, city, job) VALUES ({name},{age}, {city}, {job})print(sql)# 日期格式转换2024/05/30 → 2024-05-30date_slash2024/05/30date_dash-.join(date_slash.split(/))print(date_dash)# 2024-05-30# 倒转单词顺序sentenceI love Python programmingwordssentence.split()reversed_sentence .join(reversed(words))print(reversed_sentence)# programming Python love I5.2 数据清理和标准化# 清理多余的空白defnormalize_whitespace(text):将连续的空白字符统一为单个空格return .join(text.split())textHello world\t\tPython \n\n 编程print(normalize_whitespace(text))# Hello world Python 编程# URL slug生成defslugify(text):将标题转为URL友好的slug格式# 转小写替换空格为连字符过滤非字母数字的字符slug-.join(text.lower().split())# 更复杂的实现可以用正则但基本思路仍然是splitjoinreturnslugprint(slugify(My First Blog Post))# my-first-blog-post5.3 矩阵/表格的转置# 用split和join实现文本表格的行列转置table[姓名,年龄,城市,小明,25,北京,小红,23,上海,小刚,26,广州,]# 每行按逗号分割rows[row.split(,)forrowintable]# 转置行列互换transposedlist(zip(*rows))# 每列按逗号拼接回去result[,.join(col)forcolintransposed]forlineinresult:print(line)# 输出# 姓名,小明,小红,小刚# 年龄,25,23,26# 城市,北京,上海,广州六、切割高级操作6.1 多分隔符分割Python的split()只支持单个分隔符。如果需要多个分隔符有几种解决方案importre text苹果,香蕉;橘子|葡萄 西瓜# 方案一多次replace splitresulttext.replace(;,,).replace(|,,).replace( ,,).split(,)print(result)# [苹果, 香蕉, 橘子, 葡萄, 西瓜]# 方案二用正则表达式更灵活resultre.split(r[,;| ],text)print(result)# [苹果, 香蕉, 橘子, 葡萄, 西瓜]# 方案三re.split保留分隔符resultre.split(r([,;| ]),text)print(result)# [苹果, ,, 香蕉, ;, 橘子, |, 葡萄, , 西瓜]6.2 保留分隔符的分割importre# 用re.split的分组捕获来保留分隔符textHello, World! How are you?resultre.split(r([,.!? ]),text)# 过滤空字符串result[sforsinresultifsands! ]print(result)# [Hello, ,, World, !, How, are, you, ?]# 用在文本分句defsplit_sentences(text):按句末标点分割句子保留标点符号importre partsre.split(r([。.!?]),text)sentences[]foriinrange(0,len(parts)-1,2):sentences.append(parts[i]parts[i1])iflen(parts)%21andparts[-1]:sentences.append(parts[-1])returnsentences text你好今天天气不错。你吃饭了吗print(split_sentences(text))# [你好, 今天天气不错。, 你吃饭了吗]七、实战CSV解析器defparse_csv_line(line,delimiter,,quote_char): 解析CSV的一行支持引号内的分隔符 例如: 小明,北京,朝阳区,25 → [小明, 北京,朝阳区, 25] fields[]current_fieldin_quotesFalseforcharinline:ifcharquote_char:in_quotesnotin_quoteselifchardelimiterandnotin_quotes:fields.append(current_field)current_fieldelse:current_fieldchar fields.append(current_field)returnfields# 测试csv_line小明,北京,朝阳区,25,工程师fieldsparse_csv_line(csv_line)print(fields)# [小明, 北京,朝阳区, 25, 工程师]# 标准CSV处理还是用csv模块importcsv line小明,北京,朝阳区,25,工程师readercsv.reader([line])print(next(reader))# [小明, 北京,朝阳区, 25, 工程师]八、性能对比与最佳实践# split vs partition只需要切一次时textkey: value with many colons: extra data# split会扫描整个字符串key,valuetext.split(:,1)# 用了maxsplit1还行# partition找到第一个就停止更高效key,_,valuetext.partition(:)# 拼接join vs # 1. 少量拼接5个 或 f-string 更简洁name小明greeting你好name# 或greetingf你好{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-stringsplit()和join()互为逆操作经常搭配使用多分隔符分割用正则re.split() 下一篇我们继续字符串方法之旅——大小写转换与判断方法。

相关新闻