MST

星途 面试题库

面试题:Python正则字符集在海量数据处理中的优化实践

给定一个非常大的文本文件(假设无法一次性读入内存),其中包含各种格式的字符串。现在需要提取出所有符合特定正则字符集规则的字符串,该规则为:以一个特殊字符(如`@`、`#`、`$`)开头,后面跟着6到8位数字,再接着是一个由2到4个小写字母组成的子串。请设计一个高效的Python方案,利用`re`模块及相关技术实现该需求,详细阐述你的方案在内存管理、性能优化以及错误处理方面的思路和代码实现。
16.7万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

方案思路

  1. 内存管理:由于文件无法一次性读入内存,采用逐行读取的方式,这样每次只在内存中保留一行数据,避免内存溢出。
  2. 性能优化:使用re.finditer来查找符合正则表达式的字符串,re.finditer在处理长字符串时性能较好。同时,编译正则表达式,这样在多次匹配时可以提高效率。
  3. 错误处理:在读取文件时,使用try - except块捕获可能的文件读取错误,如文件不存在、权限不足等。

代码实现

import re


def extract_strings(file_path):
    pattern = re.compile(r'[@#$]\d{6,8}[a-z]{2,4}')
    try:
        with open(file_path, 'r', encoding='utf-8') as file:
            for line in file:
                for match in pattern.finditer(line):
                    yield match.group()
    except FileNotFoundError:
        print(f"文件 {file_path} 不存在。")
    except PermissionError:
        print(f"没有读取文件 {file_path} 的权限。")


# 使用示例
file_path = 'your_large_text_file.txt'
for match in extract_strings(file_path):
    print(match)

在上述代码中:

  1. re.compile(r'[@#$]\d{6,8}[a-z]{2,4}') 编译正则表达式,提高匹配效率。
  2. 使用with open逐行读取文件,保证内存使用的合理性。
  3. try - except块捕获并处理文件读取过程中的常见错误。
  4. 使用生成器(yield)返回匹配结果,避免一次性将所有结果存储在内存中。