MST

星途 面试题库

面试题:Python中sub和subn在正则表达式替换高级应用

假设有一个Python代码文件的内容作为字符串,里面有各种函数定义。例如 'def add(a, b): return a + b',现在要使用sub或subn方法,将所有函数定义中的参数名替换为具有特定前缀和序号的新参数名(如 'param1', 'param2' 等),同时保持函数逻辑不变。要求处理多个不同函数定义的复杂情况,写出完整且高效的代码实现,并阐述代码设计的考量以及sub和subn在该场景下选择的依据。
44.8万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
import re


def replace_params(code_str):
    def param_replacer(match):
        params = match.group(1).split(',')
        new_params = []
        for i, param in enumerate(params, start=1):
            new_param = f'param{i}'
            new_params.append(new_param)
        return f'def {match.group(2)}({", ".join(new_params)}):'

    new_code_str, count = re.subn(r'def\s+(\w+)\((.*?)\):', param_replacer, code_str, flags=re.DOTALL)
    return new_code_str, count


code = '''
def add(a, b):
    return a + b

def subtract(c, d):
    return c - d
'''
new_code, replaced_count = replace_params(code)
print(new_code)
print(f"替换次数: {replaced_count}")

代码设计考量

  1. 正则表达式匹配:使用 re 模块的 re.subn 函数来匹配函数定义。re.DOTALL 标志使得 . 可以匹配包括换行符在内的所有字符,这样能处理函数定义跨多行的情况。正则表达式 def\s+(\w+)\((.*?)\): 可以匹配函数定义的部分,其中 (\w+) 捕获函数名,(.*?) 捕获参数列表。
  2. 参数替换逻辑:在 param_replacer 函数中,对捕获到的参数列表进行分割,然后逐个替换为带有特定前缀和序号的新参数名。
  3. 返回结果re.subn 函数不仅返回替换后的字符串,还返回替换的次数,这样可以知道有多少个函数定义被处理。

sub和subn在该场景下选择的依据

  1. subsub 函数只返回替换后的字符串,如果我们只关心替换后的代码内容,不关心替换的次数,可以使用 sub
  2. subnsubn 函数除了返回替换后的字符串,还返回替换的次数。在本场景中,如果需要知道有多少个函数定义的参数被替换,使用 subn 更合适,因为可以方便地获取这个替换次数信息,用于后续可能的统计或验证。