2013-02-01 31 views
7

我想比較兩個文檔而不考慮換行符。如果內容相同但換行符的位置和數量不同,我想將一個文檔中的行映射到另一個文檔中的行。使用正則表達式比較兩個文檔

鑑於:

文獻1

I went to Paris in July 15, where I met some nice people. 
And I came back 
to NY in Aug 15. 
I am planning 
to go there soon 
after I finish what I do. 

文獻2

I went 
to Paris 
in July 15, 
where I met 
some nice people. 
And I came back to NY in Aug 15. 
I am planning to go 
there soon after I finish what I do. 

我想能夠確定在文獻1中第1行的算法包含相同的文字行1至5在文件2中,文件1中的第2行和第3行包含與文件2中的第6行相同的文本,等等。

1 = 1,2,3,4,5 
2,3 = 6 
4,5,6 = 7,8 

如果跨越其他文檔中的多行,是否有正則表達式匹配每個文檔中的每一行的方法?

+0

這些數字是什麼? –

+0

一種方法是將兩個輸入分成單詞,保留它們來自的行,並且只是逐個對應單詞(假設單詞相同)。 – nneonneo

+0

從每個文件 – hmghaly

回答

0

您可以通過DOC1的每一行迭代,做這樣的事情:

searchstring = line.replace(' ', '[ |\n]')

然後做使用這個搜索字符串上DOC2搜索。

match = re.search(searchstring, contents)

如果matchNULL,則沒有匹配。 否則,match.group(0)會給你DOC 2的匹配內容

'I went\nto Paris\nin July 15,\nwhere I met\nsome nice people.'

然後,它的分裂的一個簡單的練習,通過「\ n」和在DOC2搞清楚哪些行他們來自。

2

我不是一個Python程序員,但是這並不像可以用正則表達式來解決的問題。相反,您首先需要比較文檔以確保內容相同(預先暫時移除所有換行符)。如果不是,我不知道你想做什麼,所以我不打算解決這個問題。

創建整數集合的集合稱爲linemappings

開始一個循環。循環將同時遍歷每個文檔中的每個字符。你需要四個計數器變量。 charindex1將包含在文獻1中的當前字符索引和charindex2將包含在文獻2 lineindex1當前系統字符索引將包含在文獻1中的當前行索引和lineindex2將包含在文檔當前行索引2

開始與炭索引變量爲0,行索引變量初始化爲1。

開始循環:

獲取每個文件的當前字符:從文件1 char1char2從文件2.

如果char1char2都換行或者兩者都不是新行,然後通過1
否則前進既charindex1charindex2如果char1是換行,然後前進 否則如果char2是換行,然後由1

如果任char1char2是一個換行符推進charindex2,然後插入一個新記錄插入linemappings集合(在最後的結果將是什麼像[[1,1],[1,2],[1,3],[1,4],[1,5],[2,6],[3,6],[4,7],[5,7],[6,7],[6,8]

如果char1是換行,由1
如果char2是換行前進lineindex1,由1

0123前進

循環直到輸入結束。

(我真的無法檢驗這個,因爲我不是一個Python程序員,但希望你得到的要點,並可以對其進行修改以滿足您的需求。)

+0

@TerryLi有一個更好的答案。我會親自去的。 – JDB

3
import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 
import org.apache.commons.io.FileUtils; 

public class Compare { 
    public static void main(String[] args) throws IOException { 
     String doc1 = FileUtils.readFileToString(new File("Doc1.txt")); 
     String doc2 = FileUtils.readFileToString(new File("Doc2.txt")); 
     String[] array1 = doc1.split("\n"); 
     String[] array2 = doc2.split("\n"); 
     int[] count1 = new int[array1.length]; 
     int[] count2 = new int[array2.length]; 
     int sum1 = 0; 
     int sum2 = 0; 
     for (int i=0;i<count1.length;i++) { 
      count1[i] = sum1 + array1[i].split(" ").length; 
      sum1 = count1[i]; 
     } 
     for (int i=0;i<count2.length;i++) { 
      count2[i] = sum2 + array2[i].split(" ").length; 
      sum2 = count2[i]; 
     } 
     ArrayList<Integer> result1 = new ArrayList<Integer>(); 
     ArrayList<Integer> result2 = new ArrayList<Integer>(); 
     for (int j=0; j<count1.length;) { 
      for (int k=0; k<count2.length;) { 
       if (count1[j]==count2[k]) { 
        result1.add(j+1); 
        result2.add(k+1); 
        System.out.println(result1.toString()+" = "+result2.toString()); 
        result1 = new ArrayList<Integer>(); 
        result2 = new ArrayList<Integer>(); 
        j++;k++; 
       } else if (count1[j]>count2[k]) { 
        result2.add(k+1); 
        k++; 
       } else { 
        result1.add(j+1); 
        j++; 
       } 
      } 
     } 
    } 
} 

輸出示例:

[1] = [1, 2, 3, 4, 5] 
[2, 3] = [6] 
[4, 5, 6] = [7, 8] 

完成且工作Java代碼。這不是一個正則表達式解決方案,所以它可能不適合你的需要。

的想法是,我們將爲每個文檔的數組。數組的大小等於每個文檔中的行數。數組的第n個元素存儲了直到文檔第n行的單詞數量。然後我們確定這兩個數組中的相等元素,其索引定義了輸出的範圍。