則直接創(chuàng)建該變量,也就是說,在Python中"="即既可以用來為變量賦值, 又可以用來創(chuàng)建變量。在本發(fā)明中不對這兩種情況進(jìn)行區(qū)分,而是直接"="運(yùn)算符左邊的 變量名,并統(tǒng)計不同變量名出現(xiàn)頻率;使用正則表達(dá)式'\b (.*?)(? =\s = )'即可提取 變量名或變量名列表(例如a,b = 3, 5這樣的情況),根據(jù)需要再使用逗號進(jìn)行分割以得 到所有變量名。
[0101] 函數(shù)參數(shù):函數(shù)參數(shù)有實(shí)參和形參兩種情況,實(shí)參可能為常數(shù)、普通變量、函數(shù)調(diào) 用表達(dá)式以及這幾種情況的任意組合,本發(fā)明中暫時不考慮函數(shù)實(shí)參;函數(shù)形參在提取函 數(shù)名的同時使用正則表達(dá)式一起提??;
[0102] for循環(huán)內(nèi)定義的臨時變量:for循環(huán)內(nèi)定義的變量特點(diǎn)為,前面是關(guān)鍵字for,然 后是變量列表,接下來是關(guān)鍵字in。這里需要注意的是,由于Python序列解包功能,for循 環(huán)內(nèi)可以同時定義多個臨時變量,如果需要提取每個變量,則需要對使用正則表達(dá)式提取 的變量列表進(jìn)行分割。使用正則表達(dá)式'(?<= f〇r\s) (·*?)(?= \sin) '即可提取 for循環(huán)內(nèi)定義的臨時變量或變量列表,根據(jù)需要再使用逗號進(jìn)行分割得到所有變量名。
[0103] 依照上述方法,同樣可以使用正則表達(dá)式提取出程序中所有運(yùn)算符。
[0104] 提取出兩段代碼或兩個源文件中所有標(biāo)識符和運(yùn)算符以后,分類并按出現(xiàn)頻率從 高到低排序,如果兩段代碼中標(biāo)識符與運(yùn)算符以及頻率分布具有較高相似性,則認(rèn)為兩段 代碼相似。即如果
【主權(quán)項】
1. 一種Python源代碼文件相似性檢測方法,其特征在于,包括W下步驟: 51、 獲取用戶輸入的參數(shù)類型; 52、 若判斷出所述用戶輸入的參數(shù)類型為一個Python源文件,則應(yīng)用算法A檢測所述 Python源文件內(nèi)代碼之間的相似性; 53、 若判斷出所述用戶輸入的參數(shù)類型為一個包含Python源文件的文件夾,則應(yīng)用算 法B檢測所述文件夾中所有Python源文件之間的相似性; 54、 若判斷出所述用戶輸入的參數(shù)類型為一個目標(biāo)Python源文件和一個包含Python 源文件的目標(biāo)文件夾,則應(yīng)用算法C檢測所述目標(biāo)Python源文件與所述目標(biāo)文件夾中所有 Python源文件之間的相似性; 其中,用來檢測同一個Python源文件內(nèi)代碼之間相似性的算法A為: A1、將用戶輸入的所述Python源文件中的所有行讀入列表;對所有讀入內(nèi)容進(jìn)行預(yù)處 理,刪除讀入內(nèi)容中所有多余的空格、每行兩端的空格W及行尾的換行符; 所述多余的空格即2個相鄰標(biāo)識符或運(yùn)算符之間最多只保留一個空格,其他空格都是 多余的空格; A2、從0開始依次為列表中每個元素標(biāo)號,令indexl = 0 ;進(jìn)行步驟A3-A9 ; A3、如果當(dāng)前行被判斷為注釋行,則跳過從當(dāng)前行開始的所有連續(xù)注釋行;所述當(dāng)前行 為標(biāo)號indexl所標(biāo)識的行; A4、如果當(dāng)前行已被判斷為相似行,則跳過該行開始的所有連續(xù)相似行;將當(dāng)前行與該 當(dāng)前行之前的代碼行進(jìn)行比較,如果符合相似性檢測標(biāo)準(zhǔn)則判斷當(dāng)前行為相似行;通過查 詢Result字典獲取該信息,實(shí)現(xiàn)快速判斷; A5、遍歷列表中indexl之后的剩余元素,令index2 = indexl+1,進(jìn)行步驟A6-A8 ; A6、如果當(dāng)前行被判斷為注釋行,則跳過從當(dāng)前行開始的所有連續(xù)注釋行;此處的當(dāng)前 行為標(biāo)號index2所標(biāo)識的行; A7、如果當(dāng)前行已被判斷為相似行,則跳過該行開始的所有連續(xù)相似行; A8、對比分別W標(biāo)號indexl和標(biāo)號index2開始的若干連續(xù)行的相似性,如果符合相似 性檢測標(biāo)準(zhǔn),則將相似性結(jié)果更新到Result字典,并將index2增加符合相似性檢測標(biāo)準(zhǔn)的 連續(xù)行的步長;否則將index2增加1行; 當(dāng)index2小于等于列表中最后一個元素編號時,繼續(xù)進(jìn)行步驟A6-A8 ; A9、讀取Result字典,獲取indexl行的最大相似跨度,并將indexl增加最大相似跨度 的步長;若當(dāng)前行無相似行,則將indexl增加1 ; 在步驟A9中重置indexl的值后,當(dāng)indexl小于等于列表中最后一個元素編號時,繼 續(xù)循環(huán)進(jìn)行步驟A3-A9 ; 用來檢測同一個文件夾中所有Python源文件之間相似性的算法B為; B1、將所述用戶輸入的文件夾中所有Python源文件內(nèi)容讀入至列表allFiles,列表 allFiles的每個元素是一個列表,每個列表中的第0個元素為文件名,第1個元素是包含該 文件的所有代碼行;同時對讀取的所有內(nèi)容進(jìn)行預(yù)處理,刪除讀取的所有內(nèi)容中的所有多 余的空格、每行兩端的空格W及行尾的換行符; B2、從0開始,依次為列表allFiles中各個列表元素標(biāo)號,令indexO = 0 ;進(jìn)行步驟 B3-B13 ; B3、從0開始依次為標(biāo)號為indexO的列表中的元素標(biāo)號,令indexl = 0 ;進(jìn)行步驟 B4-B12 ; B4、如果當(dāng)前行已被判斷為相似行,則跳過該行開始的所有連續(xù)相似行; B5、如果當(dāng)前行被判斷為注釋行,則跳過從當(dāng)前行開始的所有連續(xù)注釋行; B6、選擇標(biāo)號為index3的列表,其中,indexS = indexO+1 ;進(jìn)行步驟B7-B11 ; B7、從0開始依次為標(biāo)號為index3的列表中的元素標(biāo)號,令index2 = 0 ;進(jìn)行步驟 B8-B10 ; B8、如果當(dāng)前行已被判斷為相似行,則跳過該行開始的所有連續(xù)相似行; B9、如果當(dāng)前行被判斷為注釋行,則跳過從當(dāng)前行開始的所有連續(xù)注釋行; B10、對比W indexl和index2開始的若干連續(xù)行相似性,如果符合相似性檢測標(biāo)準(zhǔn),貝U 更新Result字典,并將index2增加符合相似性檢測標(biāo)準(zhǔn)的連續(xù)行的步長;否則將index2 增加1行;當(dāng)index2小于等于編號為index3的列表最后一個元素編號時,繼續(xù)進(jìn)行步驟 B8-B10 ; B11、將index3增加1,當(dāng)index3小于等于allFiles列表中最后一個元素編號時,繼續(xù) 進(jìn)行步驟B7-B11 ; B12、讀取Result字典,獲取indexl行的最大相似跨度,并將indexl增加最大相似跨 度的步長;若當(dāng)前行無相似行,則將indexl增加1 ;當(dāng)indexl小于等于indexO的列表中的 最后一個元素編號時,進(jìn)行步驟B4-B12 ; B13、將indexO增加1 ;當(dāng)indexO小于等于allFiles列表中最后一個元素編號時,循 環(huán)進(jìn)行步驟B3-B13 ; 所述目標(biāo)Python源文件與所述目標(biāo)文件夾中所有Python源文件之間相似性的算法C 為: C1、將所述用戶輸入的目標(biāo)文件夾中所有Python源文件內(nèi)容讀入至目標(biāo)列表 allFiles,目標(biāo)列表allFiles的每個元素是一個列表,該列表的第0個元素為文件名,第1 個元素是包含該文件的所有代碼行;同時將所述用戶輸入的目標(biāo)Python源文件內(nèi)容讀入 至目標(biāo)列表currentFile ;對所有讀入內(nèi)容進(jìn)行預(yù)處理,刪除文件中所有多余的空格、每行 兩端的空格W及行尾的換行符; C2、從0開始依次為目標(biāo)列表currentFile中的元素標(biāo)號,令indexl = 0 ;進(jìn)行步驟 C3-C9 ; C3、如果當(dāng)前行被判斷為注釋行,則跳過從當(dāng)前行開始的所有連續(xù)注釋行; C4、從0開始,依次為列表allFiles中各個列表標(biāo)號,令index3 = 0 ;進(jìn)行步驟巧-C8 ; C5、從0開始依次為標(biāo)號為index3的列表中的元素標(biāo)號,令index2 = 0 ;進(jìn)行步驟 C6-C7 ; C6、如果當(dāng)前行被判斷為注釋行,則跳過從當(dāng)前行開始的所有連續(xù)注釋行; C7、對比W indexl和index2開始的若干連續(xù)行相似性,如果符合相似性檢測標(biāo)準(zhǔn),貝U 更新Result字典,并將index2增加符合相似性檢測標(biāo)準(zhǔn)的連續(xù)行的步長;否則index2增 加1 ;若index3的列表中的元素還未檢測完,則繼續(xù)進(jìn)行步驟C6-C7 ; C8、將index3增加1,當(dāng)index3小于等于allFiles列表中最后一個元素編號時,循環(huán) 進(jìn)行步驟C5-C8 ; C9、讀取Result字典,獲取indexl行的最大相似跨度,并將indexl增加最大相似跨度 的步長;若當(dāng)前行無相似行,則將indexl增加1 ; 在步驟C9中重置indexl的值后,當(dāng)indexl小于等于currentFile列表中最后一個元 素編號時,繼續(xù)循環(huán)進(jìn)行步驟C3-C9。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于, 所述相似性檢測標(biāo)準(zhǔn)為;要求完全相等,則直接將分別W indexl和index2開始的若干 連續(xù)代碼行進(jìn)行比較是否精確相等,若精確相等則認(rèn)為符合相似性檢測標(biāo)準(zhǔn)標(biāo)準(zhǔn),否則認(rèn) 為不符合; 或者,所述相似性檢測標(biāo)準(zhǔn)為;要求兩段代碼中變量名和運(yùn)算符具有一定重合度或相 似性,則需要首先提取類名、函數(shù)名、變量名等標(biāo)識符W及運(yùn)算符,并統(tǒng)計各自出現(xiàn)的頻率, 將結(jié)果按標(biāo)識符出現(xiàn)頻率從高到低進(jìn)行排序;如果標(biāo)識符與運(yùn)算符名稱W及頻率分布達(dá)到 預(yù)設(shè)標(biāo)準(zhǔn),則認(rèn)為兩段代碼相似,符合相似性檢測標(biāo)準(zhǔn)標(biāo)準(zhǔn),否則認(rèn)為不符合。
【專利摘要】本發(fā)明提供了一種Python源代碼文件相似性檢測方法,涉及計算機(jī)技術(shù)領(lǐng)域,可以準(zhǔn)確檢測出相同或相似的源代碼。所述方法包括:根據(jù)用戶輸入的不同的參數(shù)類型,采用不同的檢測方法進(jìn)行檢測,在檢測時,讀取文件內(nèi)容并進(jìn)行預(yù)處理,刪除多余的空格和換行符,然后根據(jù)指定的相似性標(biāo)準(zhǔn)對代碼進(jìn)行比對,在比對時忽略注釋行,采用逐行迭加的方式消除代碼布局不同的影響。
【IPC分類】G06F9-44
【公開號】CN104598231
【申請?zhí)枴緾N201510014906
【發(fā)明人】董付國, 孫玲玲, 原達(dá), 馮磊
【申請人】山東工商學(xué)院
【公開日】2015年5月6日
【申請日】2015年1月9日