Python结合Regex清洗竖线分隔平文件:解决异常CRLF拆分记录问题
解决方案
方案1:优化正则表达式避免灾难性回溯
你原来的正则出现灾难性回溯的核心原因是.*?\|中的惰性匹配逻辑,在长文本场景下会产生极多回溯路径。优化思路是将任意字符匹配替换为排除竖线、换行的精确匹配,完全消除回溯可能:
优化后的正则如下(24分隔符场景):
^(?!(?:[^|\n]*\|){24}[^|\n]*$)(.*)\n(?!(?:[^|\n]*\|){24}[^|\n]*$)
Python调用示例:
import re raw_text = "你的原始文本内容" # 开启多行模式 pattern = re.compile(r'^(?!(?:[^|\n]*\|){24}[^|\n]*$)(.*)\n(?!(?:[^|\n]*\|){24}[^|\n]*$)', re.MULTILINE) fixed_text = pattern.sub(r'\1 ', raw_text)
如果是测试3分隔符的示例场景,只需把正则中的24替换为3即可正常运行。
方案2:更推荐的逐行拼接方案(无正则性能问题)
正则方案在超大型文件场景下仍然有性能和内存开销问题,更建议用逐行缓存拼接的方案实现需求,逻辑更简单可调试,也支持流式处理大文件:
expected_delimiter = 24 # 测试3分隔符场景时替换为3 buffer = [] result = [] # 若已将文件读入内存,可直接遍历raw_text.splitlines() with open("你的平文件路径.txt", "r", encoding="utf-8") as f: for line in f: # 移除行尾换行符 cleaned_line = line.rstrip("\n").rstrip("\r") buffer.append(cleaned_line) # 统计当前缓存拼接后的分隔符数量 current_delimiter_count = "|".join(buffer).count("|") if current_delimiter_count == expected_delimiter: # 符合要求,用空格拼接片段加入结果 result.append(" ".join(buffer)) buffer.clear() elif current_delimiter_count > expected_delimiter: # 异常分支:分隔符数量超标,说明原始数据本身有问题,可单独标记处理 result.append(f"异常记录:{' '.join(buffer)}") buffer.clear() # 处理末尾剩余的不完整记录 if buffer: result.append(f"末尾不完整记录:{' '.join(buffer)}")
该方案没有任何回溯风险,内存占用低,还可以统计异常记录的数量,方便后续数据质量校验。
内容的提问来源于stack exchange,提问作者alexlowco
相关产品推荐
相关产品推荐

