Python源代码文件相似性检测方法_3

文档序号:8269745阅读:来源:国知局
则直接创建该变量,也就是说,在Python中"="即既可以用来为变量赋值, 又可以用来创建变量。在本发明中不对这两种情况进行区分,而是直接"="运算符左边的 变量名,并统计不同变量名出现频率;使用正则表达式'\b (.*?)(? =\s = )'即可提取 变量名或变量名列表(例如a,b = 3, 5这样的情况),根据需要再使用逗号进行分割以得 到所有变量名。
[0101] 函数参数:函数参数有实参和形参两种情况,实参可能为常数、普通变量、函数调 用表达式以及这几种情况的任意组合,本发明中暂时不考虑函数实参;函数形参在提取函 数名的同时使用正则表达式一起提取;
[0102] for循环内定义的临时变量:for循环内定义的变量特点为,前面是关键字for,然 后是变量列表,接下来是关键字in。这里需要注意的是,由于Python序列解包功能,for循 环内可以同时定义多个临时变量,如果需要提取每个变量,则需要对使用正则表达式提取 的变量列表进行分割。使用正则表达式'(?<= f〇r\s) (·*?)(?= \sin) '即可提取 for循环内定义的临时变量或变量列表,根据需要再使用逗号进行分割得到所有变量名。
[0103] 依照上述方法,同样可以使用正则表达式提取出程序中所有运算符。
[0104] 提取出两段代码或两个源文件中所有标识符和运算符以后,分类并按出现频率从 高到低排序,如果两段代码中标识符与运算符以及频率分布具有较高相似性,则认为两段 代码相似。即如果
【主权项】
1. 一种Python源代码文件相似性检测方法,其特征在于,包括W下步骤: 51、 获取用户输入的参数类型; 52、 若判断出所述用户输入的参数类型为一个Python源文件,则应用算法A检测所述 Python源文件内代码之间的相似性; 53、 若判断出所述用户输入的参数类型为一个包含Python源文件的文件夹,则应用算 法B检测所述文件夹中所有Python源文件之间的相似性; 54、 若判断出所述用户输入的参数类型为一个目标Python源文件和一个包含Python 源文件的目标文件夹,则应用算法C检测所述目标Python源文件与所述目标文件夹中所有 Python源文件之间的相似性; 其中,用来检测同一个Python源文件内代码之间相似性的算法A为: A1、将用户输入的所述Python源文件中的所有行读入列表;对所有读入内容进行预处 理,删除读入内容中所有多余的空格、每行两端的空格W及行尾的换行符; 所述多余的空格即2个相邻标识符或运算符之间最多只保留一个空格,其他空格都是 多余的空格; A2、从0开始依次为列表中每个元素标号,令indexl = 0 ;进行步骤A3-A9 ; A3、如果当前行被判断为注释行,则跳过从当前行开始的所有连续注释行;所述当前行 为标号indexl所标识的行; A4、如果当前行已被判断为相似行,则跳过该行开始的所有连续相似行;将当前行与该 当前行之前的代码行进行比较,如果符合相似性检测标准则判断当前行为相似行;通过查 询Result字典获取该信息,实现快速判断; A5、遍历列表中indexl之后的剩余元素,令index2 = indexl+1,进行步骤A6-A8 ; A6、如果当前行被判断为注释行,则跳过从当前行开始的所有连续注释行;此处的当前 行为标号index2所标识的行; A7、如果当前行已被判断为相似行,则跳过该行开始的所有连续相似行; A8、对比分别W标号indexl和标号index2开始的若干连续行的相似性,如果符合相似 性检测标准,则将相似性结果更新到Result字典,并将index2增加符合相似性检测标准的 连续行的步长;否则将index2增加1行; 当index2小于等于列表中最后一个元素编号时,继续进行步骤A6-A8 ; A9、读取Result字典,获取indexl行的最大相似跨度,并将indexl增加最大相似跨度 的步长;若当前行无相似行,则将indexl增加1 ; 在步骤A9中重置indexl的值后,当indexl小于等于列表中最后一个元素编号时,继 续循环进行步骤A3-A9 ; 用来检测同一个文件夹中所有Python源文件之间相似性的算法B为; B1、将所述用户输入的文件夹中所有Python源文件内容读入至列表allFiles,列表 allFiles的每个元素是一个列表,每个列表中的第0个元素为文件名,第1个元素是包含该 文件的所有代码行;同时对读取的所有内容进行预处理,删除读取的所有内容中的所有多 余的空格、每行两端的空格W及行尾的换行符; B2、从0开始,依次为列表allFiles中各个列表元素标号,令indexO = 0 ;进行步骤 B3-B13 ; B3、从0开始依次为标号为indexO的列表中的元素标号,令indexl = 0 ;进行步骤 B4-B12 ; B4、如果当前行已被判断为相似行,则跳过该行开始的所有连续相似行; B5、如果当前行被判断为注释行,则跳过从当前行开始的所有连续注释行; B6、选择标号为index3的列表,其中,indexS = indexO+1 ;进行步骤B7-B11 ; B7、从0开始依次为标号为index3的列表中的元素标号,令index2 = 0 ;进行步骤 B8-B10 ; B8、如果当前行已被判断为相似行,则跳过该行开始的所有连续相似行; B9、如果当前行被判断为注释行,则跳过从当前行开始的所有连续注释行; B10、对比W indexl和index2开始的若干连续行相似性,如果符合相似性检测标准,贝U 更新Result字典,并将index2增加符合相似性检测标准的连续行的步长;否则将index2 增加1行;当index2小于等于编号为index3的列表最后一个元素编号时,继续进行步骤 B8-B10 ; B11、将index3增加1,当index3小于等于allFiles列表中最后一个元素编号时,继续 进行步骤B7-B11 ; B12、读取Result字典,获取indexl行的最大相似跨度,并将indexl增加最大相似跨 度的步长;若当前行无相似行,则将indexl增加1 ;当indexl小于等于indexO的列表中的 最后一个元素编号时,进行步骤B4-B12 ; B13、将indexO增加1 ;当indexO小于等于allFiles列表中最后一个元素编号时,循 环进行步骤B3-B13 ; 所述目标Python源文件与所述目标文件夹中所有Python源文件之间相似性的算法C 为: C1、将所述用户输入的目标文件夹中所有Python源文件内容读入至目标列表 allFiles,目标列表allFiles的每个元素是一个列表,该列表的第0个元素为文件名,第1 个元素是包含该文件的所有代码行;同时将所述用户输入的目标Python源文件内容读入 至目标列表currentFile ;对所有读入内容进行预处理,删除文件中所有多余的空格、每行 两端的空格W及行尾的换行符; C2、从0开始依次为目标列表currentFile中的元素标号,令indexl = 0 ;进行步骤 C3-C9 ; C3、如果当前行被判断为注释行,则跳过从当前行开始的所有连续注释行; C4、从0开始,依次为列表allFiles中各个列表标号,令index3 = 0 ;进行步骤巧-C8 ; C5、从0开始依次为标号为index3的列表中的元素标号,令index2 = 0 ;进行步骤 C6-C7 ; C6、如果当前行被判断为注释行,则跳过从当前行开始的所有连续注释行; C7、对比W indexl和index2开始的若干连续行相似性,如果符合相似性检测标准,贝U 更新Result字典,并将index2增加符合相似性检测标准的连续行的步长;否则index2增 加1 ;若index3的列表中的元素还未检测完,则继续进行步骤C6-C7 ; C8、将index3增加1,当index3小于等于allFiles列表中最后一个元素编号时,循环 进行步骤C5-C8 ; C9、读取Result字典,获取indexl行的最大相似跨度,并将indexl增加最大相似跨度 的步长;若当前行无相似行,则将indexl增加1 ; 在步骤C9中重置indexl的值后,当indexl小于等于currentFile列表中最后一个元 素编号时,继续循环进行步骤C3-C9。
2.根据权利要求1所述的方法,其特征在于, 所述相似性检测标准为;要求完全相等,则直接将分别W indexl和index2开始的若干 连续代码行进行比较是否精确相等,若精确相等则认为符合相似性检测标准标准,否则认 为不符合; 或者,所述相似性检测标准为;要求两段代码中变量名和运算符具有一定重合度或相 似性,则需要首先提取类名、函数名、变量名等标识符W及运算符,并统计各自出现的频率, 将结果按标识符出现频率从高到低进行排序;如果标识符与运算符名称W及频率分布达到 预设标准,则认为两段代码相似,符合相似性检测标准标准,否则认为不符合。
【专利摘要】本发明提供了一种Python源代码文件相似性检测方法,涉及计算机技术领域,可以准确检测出相同或相似的源代码。所述方法包括:根据用户输入的不同的参数类型,采用不同的检测方法进行检测,在检测时,读取文件内容并进行预处理,删除多余的空格和换行符,然后根据指定的相似性标准对代码进行比对,在比对时忽略注释行,采用逐行迭加的方式消除代码布局不同的影响。
【IPC分类】G06F9-44
【公开号】CN104598231
【申请号】CN201510014906
【发明人】董付国, 孙玲玲, 原达, 冯磊
【申请人】山东工商学院
【公开日】2015年5月6日
【申请日】2015年1月9日
当前第3页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1