web-dev-qa-db-fra.com

correspondance d'adresse de rue regex

Bien que je sache qu'une correspondance d'adresse de rue ne sera jamais parfaite, je cherche à créer quelques déclarations de regex qui seront proches la plupart du temps. 

J'essaie de mettre en évidence une adresse. Je suis nul à regex et j'ai essayé de m'approcher, mais quelqu'un pourrait-il m'aider à comprendre comment améliorer cela?

chaîne:

6 h - 11 h, élémentaire Palma Sola, 6806, cinquième avenue nord-ouest, Bradenton, FL 34209 Venez me trouver juste à côté du dsfsd sa fasdfdsfsd 5001 ouest votre maman ne vit pas ici mon gué Ford 2005

Regex 1: 

/\s + (\ d {2,5}\s +) (?! [a | p] m\b) (([a-zA-Z |\s +] {1,5}) {1,2}) ? ([\ s | \, |.] +)? (([a-zA-Z |\s +] {1,30}) {1,4}) (cour | ct | street | st | drive | dr | lane | ln | road | rd | blvd) ([\ s | \, |. |;;];) (([a-zA-Z |\s +] {1,30}) {1,2} ) ([\ s | \, |.] +)?\b (AK | AL | AR | AZ | CA | CO | CT | DC | DE | FL | GA | GU | III | IA | ID | IL | IN | KS | KY | LA | MA | MD | ME | MI | MN | MO | MS | MT | NC | ND | NE | NH | NJ | NM | NV | NY | OH | OK | OU | PA | RI | SC | SD | TN | TX | UT | VA | VI | VT | WA | WI | WV | WY) ([\ s | \, |.] +)? (\ S +\d {5})? ([\ S | \, |.] +)/i

(Parfois, il n'y a qu'une rue et une ville, mais pas d'état ou de code postal)

regex 2: 

/\b (\ d {2,5}\s +) (?! [a | p] m\b) (NW | NE | SO | SE | nord | sud | ouest | est | n | e | s | w )? ([\ s | \, |.] +)? (([a-zA-Z |\s +] {1,30}) {1,4}) (cour | ct | street | st | lecteur | dr | lane | ln | road | rd | blvd)/i

Violons-le: http://jsfiddle.net/isuelt/rMC6P/11/

18
isuelt

Les adresses américaines ne sont pas un langage standard et ne peuvent être comparées à l'aide d'expressions régulières. Ils sont utiles dans certains cas isolés, mais en général, ils vous feront défaut, en particulier pour des informations comme celle-là.

Je travaillais dans une entreprise de vérification d'adresses. En réponse à votre question, pour "mettre en évidence une adresse" dans une chaîne de texte, je vous recommande d'essayer un utilitaire d'extraction. Il y en a quelques-uns et je vous suggère de regarder autour de vous, mais voicila nôtreen utilisant l'entrée de votre question --- comme vous pouvez le voir, il a trouvé l'adresse et l'a validée:

LiveAddress extraction example

Le point de terminaison de l'API renvoie JSON, qui contient les positions de début et de fin de chaque adresse, ainsi que de nombreuses informations sur chacune d'elles. (Voir la sortie CSV au bas de l'image ci-dessus.)

Je vous félicite d'avoir bravé ces expressions régulières que vous avez essayées! J'espère que cela est utile.

32
Matt

Je devais faire quelque chose de similaire pour des adresses comme 

800 SE 20 AVENUE # 603, DEERFIELD BEACH

9801 NW 3 STREET APT 5, PLANTATION

11909 GLENMORE DRIVE # 4-1, RESSORTS EN CORAIL

Ceci est la regex que j'ai utilisé

\s*([0-9]*)\s((NW|SW|SE|NE|S|N|E|W))?(.*)((NW|SW|SE|NE|S|N|E|W))?((#|APT|BSMT|BLDG|DEPT|FL|FRNT|HNGR|KEY|LBBY|LOT|LOWR|OFC|PH|PIER|REAR|RM|SIDE|SLIP|SPC|STOP|STE|TRLR|UNIT|UPPR|\,)[^,]*)(\,)([\s\w]*)\n

Il renvoie des groupes distincts pour chaque partie de l'adresse (je n'avais pas besoin d'analyser le nom de l'état pour mon cas). Essayez-le ici https://regex101.com/r/OsvOxn/3

2
nimatra

Matt a raison. L'analyse des expressions rationnelles ne sera jamais très précise. Si vous empruntez cette voie dangereuse, vous aurez inévitablement un nombre raisonnable de faux positifs et de faux négatifs. Cependant, si cela vous convient, j'aime bien utiliser une combinaison de deux expressions rationnelles - une pour les schémas basés sur la rue et une pour les schémas de grille de ville:

Nom de rue:

/\b\d{1,6} +.{2,25}\b(avenue|ave|court|ct|street|st|drive|dr|lane|ln|road|rd|blvd|plaza|parkway|pkwy)[.,]?(.{0,25} +\b\d{5}\b)?/ig

Système de grille  

/(\b( +)?\d{1,6} +(north|east|south|west|n|e|s|w)[,.]?){2}(.{0,25} +\b\d{5}\b)?\b/ig

Notez également que si l'adresse n'a pas d'état et de code postal, vous pouvez en principe oublier d'extraire le texte qui suit le nom de rue. 

0
Scottmas