如何按不同分隔符拆分枚举文本?修复Python函数缺陷
枚举文本拆分问题及解决方法
需求说明
需要拆分包含多种分隔符的枚举类文本,支持的分隔符类型包括:
- 数字加括号/圆点:如
1)、2. - 连字符:如
- - 项目符号:如
•
示例输入与期望输出:
- 输入:
"1. 下单 2. 登记订单 3. 撰写结论"
期望输出:["1. 下单", "2. 登记订单", "3. 撰写结论"] - 输入:
"- 下单 office-home - 登记订单 - 撰写结论"
期望输出:["下单 office-home", "登记订单", "撰写结论"]
原函数问题
原函数直接将-作为全局分隔符,会错误拆分文本内部的连字符(如office-home中的-),导致结果不符合预期。
原函数代码:
import re def split_text(text): # 定义不同分隔符的正则模式 patterns = [ r'\d+\)|\d+\.', r'-', r'•', ] # 合并为单个正则表达式 pattern = '|'.join(patterns) # 按模式拆分文本 parts = re.split(pattern, text) # 移除空内容 parts = [part.strip() for part in parts if part.strip()] return parts
修正方案
核心思路是仅匹配作为枚举项起始标记的分隔符,而非所有同类符号:
- 数字类分隔符(
1)、2.):直接匹配即可,这类符号不会出现在文本中间 - 连字符
-和项目符号•:仅匹配前面是文本开头、空白或标点,且后面跟着空白的情况
版本1:保留枚举前缀(如1.、-)
import re def split_text(text): # 匹配完整枚举项的正则:覆盖数字前缀、-前缀、•前缀的情况 pattern = r'(?:\d+[).]\s+.+?|- \s+.+?|• \s+.+?)(?=\s*(?:\d+[).]|-|•)\s+|$)' # 提取所有匹配项并清理空白 parts = [match.strip() for match in re.findall(pattern, text) if match.strip()] return parts
测试结果:
- 输入
"1. it is necessary to place an order 2. to enter it in the register 3. to write a conclusion"
输出:["1. it is necessary to place an order", "2. to enter it in the register", "3. to write a conclusion"] - 输入
"- it is necessary to place an order office-home - enter it in the register - write a conclusion"
输出:["- it is necessary to place an order office-home", "- enter it in the register", "- write a conclusion"]
版本2:移除-和•前缀,保留数字前缀
如果不需要-和•前缀,可在提取后额外处理:
import re def split_text(text): pattern = r'(?:\d+[).]\s+.+?|- \s+.+?|• \s+.+?)(?=\s*(?:\d+[).]|-|•)\s+|$)' raw_parts = [match.strip() for match in re.findall(pattern, text) if match.strip()] processed_parts = [] for part in raw_parts: # 移除开头的"- "或"• ",保留数字前缀 if part.startswith(('- ', '• ')): processed_parts.append(part[2:].strip()) else: processed_parts.append(part) return processed_parts
测试结果:
- 输入
"- it is necessary to place an order office-home - enter it in the register - write a conclusion"
输出:["it is necessary to place an order office-home", "enter it in the register", "write a conclusion"]
内容的提问来源于stack exchange,提问作者user12314164
相关产品推荐
相关产品推荐

