You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 00:58:23