如何使用Python正则表达式删除文件中低出现次数的input变量及对应行
实现方案
核心问题修正
你当前只匹配到第一个变量是因为用了re.search(),该方法仅返回第一个命中结果,需替换为re.finditer()遍历所有匹配项。同时优化正则匹配精度,避免误匹配。
完整实现代码
import re # 配置 file_path = "你的目标文件路径.v" # 匹配input声明的正则,分组1为变量名 input_pattern = re.compile(r'^\s*input\s*(?:\[\d+:\d+\])?\s*(\w+)\s*;', re.MULTILINE) # 匹配module行端口列表的正则 module_pattern = re.compile(r'module\s+\w+\s*\((.*?)\)\s*;', re.DOTALL) # 读取文件内容 with open(file_path, 'r', encoding='utf-8') as f: content = f.read() # 1. 提取所有input变量名 input_vars = [match.group(1) for match in input_pattern.finditer(content)] # 2. 统计每个input变量的全文出现次数(全字匹配避免误统计) var_count = {} for var in input_vars: count = len(re.findall(fr'\b{re.escape(var)}\b', content)) var_count[var] = count # 3. 筛选出现次数≤2的待删除变量 to_delete = [var for var, cnt in var_count.items() if cnt <= 2] # 4. 删除module端口列表中的待删除变量 def replace_module_ports(match): ports_str = match.group(1) # 拆分端口,去除空格和换行 ports = [p.strip() for p in ports_str.split(',')] # 过滤待删除端口 new_ports = [p for p in ports if p not in to_delete] # 拼接回module行 return match.group(0).replace(ports_str, ','.join(new_ports)) new_content = module_pattern.sub(replace_module_ports, content) # 5. 删除对应input声明行 lines = new_content.split('\n') new_lines = [] for line in lines: line_match = input_pattern.match(line) if line_match: var = line_match.group(1) if var in to_delete: # 跳过待删除的input行 continue new_lines.append(line) final_content = '\n'.join(new_lines) # 6. 写回文件 with open(file_path, 'w', encoding='utf-8') as f: f.write(final_content)
适配说明
- 如果你的端口位宽存在参数化写法(比如
[WIDTH-1:0]),可以修改input正则的位宽匹配部分为(?:\[.*?:.*?\])?即可适配 - 如果你需要排除input声明行本身的计数,可以在统计次数时统一减1即可
内容的提问来源于stack exchange,提问作者Aron Chabane
相关产品推荐
相关产品推荐

