Question

Avec Ruby (newb) et Regex, j'essaie d'analyser le numéro de rue à partir de l'adresse de la rue. Je n'ai pas de difficulté avec les plus faciles, mais j'ai besoin d'aide pour:

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

Merci pour l'aide !!

UPDATE (s):

'6223 1/2 2ND ST' == > '2EME ST'

et de @pesto '221B Baker Street' == > 'Baker Street'

Était-ce utile?

La solution

Ceci supprimera tout ce qui se trouve à l'avant de la chaîne jusqu'à ce qu'il frappe une lettre:

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

S'il est possible d'avoir quelque chose comme "221B Baker Street", vous devez utiliser quelque chose de plus complexe. Cela devrait fonctionner:

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

Autres conseils

Correspondance de groupe:

.*\d\s(.*)

Si vous devez également prendre en compte les numéros d'appartement:

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

Qui prendrait soin de 123A Street Name

Cela devrait effacer les nombres à l'avant (et l'espace) tant qu'il n'y a pas d'autres nombres dans la chaîne. Capturez simplement le premier groupe (. *)

Il existe un autre ensemble de réponses stackoverflow: chaîne

Je pense que l'approche décodeur google / yahoo est la meilleure solution, mais dépend de la fréquence / du nombre d'adresses dont vous parlez - sinon la réponse sélectionnée serait probablement la meilleure

Les noms de rue peuvent-ils aussi être des numéros? Ex.

1234 45TH ST

ou même

1234 45 ST

Vous pouvez traiter le premier cas ci-dessus, mais le second est difficile.

Je scinderais l'adresse sur des espaces, ignorerais les composants principaux ne contenant pas de lettre, puis joignerais le reste. Je ne connais pas Ruby, mais voici un exemple Perl qui souligne également le problème de mon approche:

#!/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

Aïe! Analyser une adresse en soi peut être extrêmement désagréable à moins de travailler avec des adresses normalisées. La raison en est que le "numéro principal" qui est souvent appelé le numéro de rue peut se trouver à divers endroits dans la chaîne, par exemple:

  1. RR 2, case 15 (le RR peut également être une route rurale, HC, HCR, etc.)
  2. Boîte postale 17
  3. 12B-7A
  4. NW95E235
  5. etc.

Ce n’est pas une sous-expédition banale. Selon les besoins de votre application, le mieux est d'obtenir des informations précises sur un service Web de vérification des adresses. Une poignée de fournisseurs offrent cette fonctionnalité.

Dans l’intérêt d’une divulgation complète, je suis le fondateur de SmartyStreets. Nous avons une API de service Web de vérification d'adresse qui validera et normalisera votre adresse pour vous assurer qu'elle c'est réel et vous permet d'obtenir la partie numéro primaire / numéro de maison. N'hésitez pas à me contacter personnellement pour toute question.

/ [^ \ d] + $ / correspondra également à la même chose, sauf si vous utilisez un groupe de capture.

Pour référence ultérieure, http://www.rubular.com/

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top