使用Python基于多句号分隔符配对元素的文本数据清洗求助
别用split了,直接用正则匹配捕获每一组(名称,数值)才是正道,分割很容易把相邻的有效组搅在一起。
针对你的场景,写一个精准匹配每对数据的正则,用re.findall一次性提取所有有效内容:
import re string = 'apples, red .... 0.15 apples, green ... 0.99\nbananas (bunch).......... 0.111\nfruit salad, small........1.35 [unwanted stuff #1.11 here]\nunwanted line here\nfruit salad, large .... 1.77 strawberry ........ 0.66 unwanted 00-11info here' # 正则匹配每一组(名称,数值) pattern = r'(\S.*?)\.{3,}\s*(\d+\.\d+)(?:\s+.*?)?(?=\s+\S.*?\.{3,}|\s*$)' matches = re.findall(pattern, string) # 整理成目标格式 for name, value in matches: clean_name = name.strip() print(f"{clean_name} | {value}")
正则规则说明:
(\S.*?):捕获名称,以非空白字符开头(跳过开头冗余空格),非贪婪匹配直到遇到连续句号,确保不会误吞后续内容\.{3,}:匹配至少3个句号(严格符合你的分隔规则)\s*:兼容句号与数值之间的任意空格(不管有没有空格都能匹配)(\d+\.\d+):捕获小数格式的数值(如果需要支持整数,改成(\d+(?:\.\d+)?)即可)(?:\s+.*?)?:非捕获组,匹配数值后的无用文本,非贪婪模式避免吞掉下一组有效数据(?=\s+\S.*?\.{3,}|\s*$):正向预查,确保匹配终止时,后续要么是下一组的名称+句号,要么是行尾,彻底过滤无用文本
输出结果:
apples, red | 0.15 apples, green | 0.99 bananas (bunch) | 0.111 fruit salad, small | 1.35 fruit salad, large | 1.77 strawberry | 0.66
这样既解决了数据配对混乱的问题,也彻底过滤了数值后的无用文本。如果你的数值有其他格式(比如整数、带千分位),只需要微调正则里的数值捕获部分即可。
内容的提问来源于stack exchange,提问作者user30640814
相关产品推荐
相关产品推荐

