You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 01:51:00