2009-06-18 12 views
3

Mit Ruby (newb) und Regex versuche ich die Straßennummer von der Adresse zu analysieren. Ich habe keine Probleme mit den leicht ist, aber ich brauche etwas Hilfe auf:stripping street numbers von den straßenadressen

'6223 1/2 S FIGUEROA ST' ==> 'S FIGUEROA ST'

Danke für die Hilfe !!

UPDATE (e):

'6223 1/2 2. ST' ==> '2. ST'

und von @pesto '221B Baker Street' ==> 'Baker Street'

+1

Muss es in internationalen Kontexten funktionieren? Oder mit US-Straßennamen, die Zahlen enthalten? Es gibt genug Städte mit einer "23. Straße". – MSalters

Antwort

2

Dies alles auf der Vorderseite der Schnur Streifen wird, bis er einen Brief hit:

street_name = address.gsub(/^[^a-zA-Z]*/, '') 

Wenn es möglich ist, etwas zu haben, wie "221B Baker Street", dann muss man etwas Komplexeres benutzen. Dies sollte funktionieren:

street_name = address.gsub(/^((\d[a-zA-Z])|[^a-zA-Z])*/, '') 
+0

guter Punkt, aber danke – kenny

+0

@Kenny: Ich aktualisierte es mit einer Regex, die '221B' Art Sachen auflösen, während immer noch '1/2'. – Pesto

+0

2. Versuch funktioniert gut. – kenny

2

Gruppe Matching:

.*\d\s(.*) 

Wenn Sie auch zu berücksichtigen Wohnung Nummern nehmen müssen:

.*\d.*?\s(.*) 

Welche Pflege 123A Straßenname

nehmen würde, dass die Zahlen auf der Vorderseite Streifen sollte (und den Raum), solange es keine anderen Zahlen in der Kette sind. Erfassen Sie einfach die erste Gruppe (. *)

+0

123 2. ST ist dann ein Problem. – kenny

0

/[^\d]+$/ wird auch die gleiche Sache übereinstimmen, außer ohne eine Erfassungsgruppe zu verwenden.

1

Können Straßennamen auch Nummern sein? Z.B.

1234 45TH ST 

oder sogar

1234 45 ST 

Sie mit dem ersten Fall umgehen kann, aber der zweite ist schwierig.

Ich würde die Adresse auf Leerzeichen aufteilen, alle führenden Komponenten, die keinen Buchstaben enthalten, überspringen und dann den Rest verbinden. Ich weiß nicht, Rubin, aber hier ist ein Perl-Beispiel, das auch das Problem mit meinem Ansatz unterstreicht:

#!/usr/bin/perl 

use strict; 
use warnings; 

my @addrs = (
    '6223 1/2 S FIGUEROA ST', 
    '1234 45TH ST', 
    '1234 45 ST', 
); 

for my $addr (@addrs) { 
    my @parts = split//, $addr; 

    while (@parts) { 
     my $part = shift @parts; 
     if ($part =~ /[A-Z]/) { 
      print join(' ', $part, @parts), "\n"; 
      last; 
     } 
    } 
} 

C:\Temp> skip 
S FIGUEROA ST 
45TH ST 
ST 
1

Ouch! Das Parsen einer Adresse kann sehr unangenehm sein, wenn Sie nicht mit standardisierten Adressen arbeiten.Der Grund dafür, dass die „Hauptnummer“, die oft die Hausnummer genannt wird, an verschiedenen Stellen innerhalb der Kette sein kann, zum Beispiel:

  1. RR 2 Box 15 (RR auch Rural Route, HC, HCR sein kann , etc.)
  2. PO Box 17
  3. 12B-7A
  4. NW95E235
  5. usw.

Es ist kein triviales undertacking. Abhängig von den Bedürfnissen Ihrer Anwendung, sind Sie am besten zu genaue Informationen zu erhalten ist eine Adresse Verifikation Web-Service verwenden. Es gibt eine Handvoll Anbieter, die diese Fähigkeit bieten.

Im Interesse der vollständigen Offenlegung bin ich der Gründer von SmartyStreets. Wir haben eine address verification web service API, die Ihre Adresse validiert und standardisiert, um sicherzustellen, dass sie echt ist und Ihnen erlaubt, den primären/Hausnummerteil zu bekommen. Sie sind herzlich eingeladen, mich persönlich mit Fragen zu kontaktieren.