如何高效用正则从百万级字符串列表中排除20-22位数字项
优化百万级字符串列表过滤的方案
你的代码耗时主要有三个核心问题:
- 两次遍历列表,且第二次过滤时用
x not in exclusao2,列表的in操作是O(n)复杂度,百万级数据下会变成O(n²)的耗时灾难 - 正则表达式没有预编译,每次循环都要重新解析编译,额外消耗时间
- 正则表达式用了不必要的环视逻辑,匹配效率低
下面是两种高效优化方案,都能把耗时从20分钟压缩到几秒内:
方案1:用预编译正则直接过滤
先编译匹配20~22位纯数字的正则,然后单次遍历完成过滤:
import re # 预编译正则,确保匹配整个字符串是20-22位数字 filter_pattern = re.compile(r'^\d{20,22}$') lines2 = [item for item in lines2 if not filter_pattern.match(item)]
方案2:用字符串内置方法(更快)
直接用len()判断长度,isdigit()判断是否全数字,比正则的解析开销更小:
lines2 = [item for item in lines2 if not (20 <= len(item) <= 22 and item.isdigit())]
优化原理说明
- 去掉了冗余的两次遍历:直接在列表推导式里完成判断,只遍历一次列表
- 替换O(n)的列表查找为直接条件判断:彻底避免了原代码中
x not in exclusao2的巨量耗时 - 简化匹配逻辑:不管是正则还是内置方法,都只做必要的判断,去掉了原正则中没必要的前后数字环视
内容的提问来源于stack exchange,提问作者Leonardo Nascimento
相关产品推荐
相关产品推荐

