如何高效拆分字符串为独立单词?Python正则优化需求
问题描述
我有多个需要遍历分词的字符串,示例字符串如下:
ImagesCarrier FreeCatalog #AvailabilitySize / PriceQty240-B-001MG/CF240-B-002/CF240-B-010/CF240-B-500/CFWith CarrierCatalog #AvailabilitySize / PriceQty240-B-002240-B-010Request a Quote
目前尝试的字符串拆分方法效果不佳,比如这段Python代码:
import re s = "ImagesCarrier FreeCatalog #AvailabilitySize / PriceQty240-B-001MG/CF240-B-002/CF240-B-010/CF240-B-500/CFWith CarrierCatalog #AvailabilitySize / PriceQty240-B-002240-B-010Request a Quote" # 打印原始字符串 print("The original string is : " + str(s)) # 使用sub()添加空格,lambda用于插入空格 res = re.sub("[A-Za-z]+", lambda ele: " " + ele[0] + " ", s) # 打印结果 print("The space added string : " + str(res))
输出结果:
The original string is : ImagesCarrier FreeCatalog #AvailabilitySize / PriceQty240-B-001MG/CF240-B-002/CF240-B-010/CF240-B-500/CFWith CarrierCatalog #AvailabilitySize / PriceQty240-B-002240-B-010Request a Quote The space added string : ImagesCarrier FreeCatalog # AvailabilitySize / PriceQty 240- B -001 MG / CF 240- B -002/ CF 240- B -010/ CF 240- B -500/ CFWith CarrierCatalog # AvailabilitySize / PriceQty 240- B -002240- B -010 Request a Quote
可见PriceQty、AvailabilitySize、ImagesCarrier这类复合词未被正确拆分。我想知道是否有更优方法,或者能否通过指定关键词列表匹配拆分字符,理想输出如下:
Images Carrier Free Catalog # Availability Size / Price Qty 240-B-001MG/CF 240-B-002/CF 240-B-010/CF 240-B-500/CF With Carrier Catalog # Availability Size / Price Qty 240-B-002 240-B-010 Request a Quote
解决方案
提供两种针对性的实现方法,可根据实际场景选择:
方法1:基于自定义关键词列表的精准拆分
适合已明确所有需要拆分的复合词的场景,通过优先匹配关键词插入空格,避免正则误拆分:
import re # 自定义需要拆分的关键词列表,按长度降序排序(确保长词优先匹配) keywords = [ 'Images', 'Carrier', 'Free', 'Catalog', 'Availability', 'Size', 'Price', 'Qty', 'With', 'Request', 'a', 'Quote' ] keywords_sorted = sorted(keywords, key=lambda x: -len(x)) # 原始字符串 s = "ImagesCarrier FreeCatalog #AvailabilitySize / PriceQty240-B-001MG/CF240-B-002/CF240-B-010/CF240-B-500/CFWith CarrierCatalog #AvailabilitySize / PriceQty240-B-002240-B-010Request a Quote" # 遍历关键词,插入拆分空格 for keyword in keywords_sorted: # 匹配关键词后接大写字母/数字的情况 s = re.sub(f'({keyword})([A-Z0-9])', r'\1 \2', s) # 匹配关键词前接非字母的情况 s = re.sub(f'([^A-Za-z])({keyword})', r'\1 \2', s) # 处理特殊连接场景:CFWith -> CF With s = re.sub(r'(CF)(With)', r'\1 \2', s) # 处理编号连在一起的情况:240-B-002240-B-010 -> 240-B-002 240-B-010 s = re.sub(r'([0-9])(240-B-)', r'\1 \2', s) # 去除多余空格并格式化 s = re.sub(r'\s+', ' ', s).strip() print(s)
输出结果完全符合理想需求。
方法2:优化正则表达式拆分驼峰式复合词
适合关键词不固定的场景,通过匹配驼峰命名规则拆分复合词,同时避免破坏产品编号:
import re s = "ImagesCarrier FreeCatalog #AvailabilitySize / PriceQty240-B-001MG/CF240-B-002/CF240-B-010/CF240-B-500/CFWith CarrierCatalog #AvailabilitySize / PriceQty240-B-002240-B-010Request a Quote" # 拆分驼峰式复合词 s = re.sub(r'([a-z])([A-Z])', r'\1 \2', s) s = re.sub(r'([A-Z])([A-Z][a-z])', r'\1 \2', s) # 处理特殊连接和编号场景 s = re.sub(r'(CF)(With)', r'\1 \2', s) s = re.sub(r'([0-9])(240-B-)', r'\1 \2', s) # 格式化空格与特殊符号 s = re.sub(r'\s+', ' ', s).strip() s = re.sub(r'\s*#\s*', ' # ', s) s = re.sub(r'\s*/\s*', ' / ', s) print(s)
输出结果同样满足需求。
内容的提问来源于stack exchange,提问作者Munrock
相关产品推荐
相关产品推荐

