2016-04-06 12 views
1

Ich habe ein Dokument, wo es eine Adresse gibt, aber am Anfang gibt es ein Datum. Ich möchte eine Regex, um die Adresse zu extrahieren, weil ich nur das Datum bekomme.Wie man Adresse mit regulären Ausdrücken extrahiert

Das Format der Adresse

  • 1 zu 5 Nummern dann
  • Raum dann
  • aufeinanderfolgende Worte, aber keine Ziffern dann
  • Raum oder Komma dann
  • Wort dann
  • space oder Komma dann
  • 2 Großbuchstaben (am Ende dieser zwei le tters)

heißt

  • 5664 rue pierre labelle montreal QC
  • 5456 avenue martin curé, Sherbrooke, QC

Ich versuchte dies aber ich nichts. Ich habe mehr als ein paar Stunden gespielt, aber manchmal bekomme ich das Datum des Dokuments, das vor der Adresse steht, und dann zwei Wörter am Anfang des Absatzes.

"\\d{1,5}\\s(\\b\\w+\\b){1,2}\\w*\\s?,?\\w*\\s?,?\\w*\\s?,?[A-ZA-Z]" 

Dies ist Teil des Textes

23. Juli 2016

George Washington bei 5664 leben rue pierre labelle montreal QC G1H 3A4. Lorem ipsum dolor sitzen amet, consectetur adipiscing elit.

Ein weiteres Dokument

5. Januar 2016

Juana Perez auf 5456 avenue curé martin leben, Sherbrooke, QC, G1H 3A8. Lorem ipsum dolor sitzen amet, consectetur adipiscing elit.

Ein weiteres Dokument

Salvador Dali living at 

5 Ch Ste-Catherine 
Montreal QC 
J2S 8W3 
+2

Diese finden vielleicht ein bisschen chaotisch, da jede Adresse ihr eigenes Format zu haben scheint. Dürfen wir fragen, woher die Quelle für diese Adressen kommt, und vielleicht gibt es eine Möglichkeit für Sie, sie mit allen im gleichen Format zu exportieren? –

+0

Wir sind dabei, diese Daten zu vereinheitlichen und einen Wechsel zu unseren Lieferanten vorzuschlagen. In der Zwischenzeit stammen alle Texte aus Verträgen verschiedener Lieferanten. Wir erzeugen die Datei lokal (und gespeichert in db) über einen Service, aber der Text wird von ihnen gesendet. Wir haben 3 Muster identifiziert, die ich in meinen Beispielen angegeben habe. Es gibt viele Verträge, aber dies sind die 3 Adressenformate. –

+1

Ich gab Ihnen eine Lösung unten. Ich denke, Sie brauchen hier keine regulären Ausdrücke zu verwenden. –

Antwort

0

Hier ist Java-Äquivalent von regex101.com/r/vA8oC2/4.

Grundsätzlich starten @"at" Suche, bis Sie "."

package com.foo; 

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class TestRegex { 

public static void main(String[] args) { 
    Pattern compile = Pattern.compile("at\\s(\\d{1,5}[\\s\\w,\\d]+)\\.",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE| Pattern.UNICODE_CHARACTER_CLASS); 
    String s ="23 July 2016\n" 
      + "George Washington living at 5664 rue pierre labelle montreal QC G1H 3A4. Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n" 
      +"05 January 2016\n" 
      + "Juana Perez living at 5456 avenue martin curé, sherbrooke, QC, G1H 3A8. Lorem ipsum dolor sit amet, consectetur adipiscing elit."; 
    System.out.println(s); 
    System.out.println(System.getProperty("line.separator")); 
    System.out.println("Searching Addresses....."); 
    System.out.println(System.getProperty("line.separator")); 
    Matcher matcher = compile.matcher(s); 
    while(matcher.find()){ 
     System.out.println(matcher.group(1)); 
    } 
    System.out.println(System.getProperty("line.separator")); 
    System.out.println("Completed Searching Addresses"); 


} 
} 
+0

Eine andere Frage für Sie. Ich ein anderes Beispiel, wo die Adresse bei der Unterschrift ist. Es gibt immer noch eine aber dann neue Zeile und jedes Segment der Adresse in einer neuen Zeile. Ich möchte versuchen, [\ r \ n] + in dein Muster einzufügen, aber es funktioniert nicht. Ich habe die Frage mit der 3. Variante aktualisiert. Vielen Dank! –

+1

https://regex101.com/r/vA8oC2/5 – Sanj

+0

Danke so sehr! –

0

Eine wirklich schöne an diesem Datensatz ist, dass die drei Adresstypen jeweils eine unterschiedliche Anzahl von Zeilen hat, insbesondere 1, 2 oder 3. Sie diese verwenden können, um Bestimmen Sie, welches Format eine Adresse hat und extrahieren Sie dann einfach, was Sie benötigen. Sie werden feststellen, dass ich in meiner Lösung nicht einmal einen regulären Ausdruck verwendet habe.

public static void main(String[] args) { 
    int state = 0; 

    String line; 
    String[] array = new String[3]; 
    BufferedReader br = new BufferedReader(new FileReader("addresses.txt")); 

    while ((line = br.readLine()) != null) { 
     if (line.equals("")) { 
      processAddress(array, state); 
      state = 0; 
     } 
     else { 
      array[state] = line; 
      ++state; 
     } 
    } 
} 

// You are free to handle each extracted address component however you like. 
// For the purpose of illustration, I chose to print the components to 
// the console. 
public static void processAddress(String[] array, int state) { 
    switch(state) { 
     case 1: 
      // 1701 Verling Ave, Saanichton, BC, V8M 1X6 
      String[] parts = array[0].split(","); 
      System.out.println("Address is " + parts[0]); 
      System.out.println("State/city is " + parts[1] + ", " + parts[2]); 
      System.out.println("Zip code is " + parts[3]); 

     case 2: 
      // 2916 Prior St 
      // Victoria BC V8T3Y5 
      String[] parts = array[1].split(" "); 
      System.out.println("Address is " + array[0]); 
      System.out.println("State/city is " + parts[0] + ", " + parts[1]); 
      System.out.println("Zip code is " + parts[2]); 

     case 3: 
      // 834 Johnson St 
      // Victoria BC 
      // V8W 1N3 
      System.out.println("Address is " + array[0]); 
      System.out.println("State/city is " + array[1]); 
      System.out.println("Zip code is " + array[2]); 
    } 
} 
+0

Danke für Ihre Antwort. Aber ich habe ein Problem, meine Dateien sind nicht nur Adressen. Der Text ist der eigentliche Vertrag, wo irgendwo im Text die Adresse steht wie in den Beispielen. Das ist, was ich dachte, dass die Verwendung von regulärem Ausdruck schnell zu einem Muster passen und die benötigten Daten extrahieren würde. –

+1

Dann haben Sie eine schlechte Frage IMO gestellt. Sie müssen uns das _exact_ Format der Adressen mitteilen und das haben Sie nicht gemacht. –

Verwandte Themen