本文介绍使用python正则表达式高效处理文本文件:逐行读取内容,自动提取所有连续数字(如"123"、"45")存入数字列表,并生成剔除所有数字后的纯净字符串,全程内存友好、无需手动循环控制。
本文介绍使用python正则表达式高效处理文本文件:逐行读取内容,自动提取所有连续数字(如"123"、"45")存入数字列表,并生成剔除所有数字后的纯净字符串,全程内存友好、无需手动循环控制。
在实际数据预处理中,常需将混杂数字的文本行“一分为二”:既保留数字用于后续分析(如版本号、ID、计数),又获取不含数字的干净文本(如清洗后的日志、用户输入或自然语言片段)。Python 的 re 模块配合上下文管理器 with open() 可优雅实现这一目标。
以下为完整可运行示例:
import re
# 初始化两个空列表,分别存储每行提取的数字和净化后的字符串
all_numbers = []
clean_lines = []
with open('file.txt', 'r', encoding='utf-8') as file:
for line in file:
line = line.rstrip('\n') # 移除换行符,避免影响输出整洁性
# 提取所有连续数字(支持多位数,如"abc123def45" → ['123', '45'])
numbers = re.findall(r'\d+', line)
# 移除所有数字(包括多位数),保留其余字符及空格
cleaned = re.sub(r'\d+', '', line)
all_numbers.append(numbers) # 每行对应一个数字子列表
clean_lines.append(cleaned) # 每行对应一个净化后字符串
# 示例输出(可根据需求替换为写入文件、转DataFrame等)
for i, (nums, clean) in enumerate(zip(all_numbers, clean_lines), 1):
print(f"Line {i}: digits → {nums!r}, cleaned → {clean!r}")
✅ 关键说明:
- re.findall(r'\d+', line) 精确捕获所有连续数字串(\d+ 表示一个及以上数字),而非单个数字字符(r'\d' 会把 "123" 拆成 ['1','2','3']);
- re.sub(r'\d+', '', line) 全局替换所有数字串为空字符串,不破坏原有空格与标点结构;
- 使用 with open() 自动安全关闭文件,避免资源泄漏;
- 若需统一扁平化所有数字(如合并为单个大列表),可用 sum(all_numbers, []);
- 对于超大文件,此方案仍保持流式处理(逐行读取),内存占用恒定。
⚠️ 注意事项:
- 若文件含非UTF-8编码(如GBK),请显式指定 encoding='gbk';
- re.findall 返回的是字符串列表(如 ['42', '7']),如需数值计算,请用 list(map(int, numbers)) 转换;
- 正则中未启用 re.ASCII 标志,故 \d 在 Unicode 模式下可能匹配全角数字(如123);若需严格匹配 ASCII 数字,建议改用 r'[0-9]+'。
该方法简洁、健壮、符合 Pythonic 风格,是文本数字分离任务的标准实践方案。










