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

Python如何计算两段代码差异 实现忽略注释与空白字符的校验方案

忽略注释与空白的代码智能校验和Python实现

实现思路

对比仅存在注释、空白差异的代码时,核心逻辑是先对代码做归一化预处理,过滤所有无关内容后再计算哈希校验和,即可实现无关变更的忽略。

具体实现

依赖引入

仅需要Python标准库,无需额外安装依赖:

import re
import hashlib

代码归一化函数

这里提供Python、C/Java两类常见语言的归一化实现,可自行扩展其他语言规则:

def normalize_python_code(code: str) -> str:
    # 移除三引号包裹的多行注释
    code = re.sub(r'(\'\'\'(.|\n)*?\'\'\'|\"\"\"(.|\n)*?\"\"\")', '', code, flags=re.DOTALL)
    # 移除#开头的单行注释
    code = re.sub(r'#.*', '', code)
    # 移除所有空白字符,若需保留语义相关空格可替换为 re.sub(r'\s+', ' ', code)
    code = re.sub(r'\s+', '', code)
    return code

def normalize_c_java_code(code: str) -> str:
    # 移除/* */包裹的多行注释
    code = re.sub(r'/\*(.|\n)*?\*/', '', code, flags=re.DOTALL)
    # 移除//开头的单行注释
    code = re.sub(r'//.*', '', code)
    # 移除所有空白字符
    code = re.sub(r'\s+', '', code)
    return code

校验和计算函数

def calc_smart_checksum(code: str, lang: str = "python") -> str:
    # 不同语言对应不同归一化规则
    normalize_map = {
        "python": normalize_python_code,
        "c": normalize_c_java_code,
        "java": normalize_c_java_code
    }
    normalize_func = normalize_map.get(lang)
    if not normalize_func:
        raise ValueError(f"不支持的语言类型:{lang}")
    
    normalized_code = normalize_func(code)
    # 使用sha256计算校验和,可替换为md5等其他哈希算法
    return hashlib.sha256(normalized_code.encode("utf-8")).hexdigest()

使用示例

# 仅存在注释、空白差异的两段Python代码
code_version1 = """
def calculate_sum(x, y):
    # 计算两个数的和
    result = x + y
    return result
"""

code_version2 = """
def calculate_sum(x, y):
    result = x + y
    return result # 返回计算结果
"""

checksum1 = calc_smart_checksum(code_version1)
checksum2 = calc_smart_checksum(code_version2)
print(checksum1 == checksum2) # 输出:True

优化提示

  • 如果需要保留字符串字面量内部的内容不被误处理,可改用语法解析库提取代码的语法节点,过滤注释节点后再生成归一化代码,准确率更高
  • 可根据实际场景调整空白处理规则,比如只移除行首尾空白、换行符,保留代码内部的必要空格

内容的提问来源于stack exchange,提问作者Maria Laura Brzezinski Meyer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 12:15:04