2013-02-01 16 views
7
kullanarak bildirme

Satır sonları ne olursa olsun iki belgeyi karşılaştırmak istiyorum. İçerik aynıysa ancak satır sonlarının konumu ve miktarı farklıysa, bir belgede bulunan satırları diğerinde satırlara eşlemek istiyorum.İki belgeyi regex

Verilen: 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. 

Belge I Belgesi 1 'de bu hat 1 belirleme kabiliyetine sahip olan bir algoritma isteyen 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 ile 5 arasında çizgiler aynı metni içerir

Doküman Belge 2'de, Belge 1'deki satır 2 ve 3, Belge 2'deki satır 6 ile aynı metni içerir.

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

Diğer belgelerde birden çok satıra yayılıyorsa, her belgede her satırın eşleşmesi için normal ifadelerle bir yol var mı?

+0

Bu numaralar nedir? –

+0

Bir yaklaşım, her iki girdiyi kelimelere ayırmak, gelen satırları korumak ve sadece kelimeleri tek tek yazmaktır (kelimelerin aynı olduğunu varsayarak). – nneonneo

+0

her bir belgeden eşleşen satırlar – hmghaly

cevap

0

Sen doc1 her satırı yineleme ve böyle bir şey yapabilirsiniz:

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

O zaman bu arama dizesini kullanarak doc2 üzerinde bir arama yapın. matchNULL olduğunu

match = re.search(searchstring, contents)

, o zaman eşleşme yoktu. Else , match.group(0) size doküman 2. eşleşen içeriğini

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

Sonra '\ n' ve doc2 hangi hatları bulmaktan tarafından geldikleri o bölme basit bir egzersiz verecektir.

2

Ben bir python programcısı değilim, ancak bu regex ile çözülebilir bir sorun gibi görünmüyor. Bunun yerine, önce içeriğin aynı olduğundan emin olmak için belgeleri karşılaştırmak isteyeceksiniz (önce tüm satırları geçici olarak kaldırın). Olmazsa ne yapmak istediğini bilmiyorum, o yüzden bunu yapmayacağım.

linemappings bir döngü başlayın denilen tamsayı koleksiyonları bir koleksiyon oluşturun. Döngü, her bir belgedeki her karaktere aynı anda adım atacaktır. Dört sayaç değişkenine ihtiyacınız olacak. charindex1 Belge 1 mevcut karakter dizini içerecek ve charindex2 Belge 1'de mevcut satır endeksini içerecektir Belgesinde 2. lineindex1 mevcut karakteridir endeksini içerecektir ve lineindex2 2.

Başlangıç ​​Belgesinde geçerli satır endeksini içerecektir char indeksi değişkenleri 0 ve satır indeksi değişkenleri 1'e başlatıldı.

Başlangıç ​​Döngü:

her belgeden akım karakterini alın: Belgenin 2. dokümanın 1'den char1 ve char2

char1 VE char2 sonra, İKİ yeni satırlar veya NE yeni satırların ise Hem charindex1 hem de charindex2 ile ilerleyin.
Else char1 yeni bir satır ise,ilerleyin char2 Yeni satır ise Else 1.
tarafından 210 ardından YA char1 veya char2 bir satır olduğu 1.

Eğer tarafından charindex2 ilerletmek, daha sonra linemappings koleksiyonuna yeni bir kayıt (bir şey olacak sonunda sonuç eklemek char1 bir satır ise benzeri [[1,1],[1,2],[1,3],[1,4],[1,5],[2,6],[3,6],[4,7],[5,7],[6,7],[6,8])

, bir satır olan 1.
char2 Eğer tarafından lineindex1 ilerletmek, 1.

tarafından lineindex2 ilerletmek

Girişin sonuna ulaşana kadar döngü yapın.

(Ben piton programcı değilim çünkü ben gerçekten bu sınamak olamazdı, ama umarım olsun özü ve ihtiyaçlarınıza göre değiştirebilirsiniz.)

+0

@TerryLi'nin daha iyi bir cevabı var. Bununla kişisel olarak giderdim. – 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++; 
       } 
      } 
     } 
    } 
} 

Numune çıkışı:

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

Tam ve çalışan Java kodu. Bu bir regex çözümü değil, bu yüzden ihtiyacınıza uygun olmayabilir.

Fikir, her belge için bir dizi oluşturmamızdır. Dizinin boyutu, her bir belgedeki satır sayısına eşittir. Dizinin nth elemanı, belgenin nth satırına kadar görülen sözcüklerin sayısını depolar. Sonra, indeksleri çıktı aralığını tanımlayan her iki dizide de eşit elemanları tanımlarız.