wake-up-neo.net

regex-Adresse übereinstimmen

Ich weiß zwar, dass das Übereinstimmen mit einer Adresse nie perfekt sein wird, aber ich möchte ein paar Regex-Anweisungen erstellen, die die meiste Zeit näher kommen. 

Ich versuche, eine Adresse hervorzuheben. Ich sacke an Regex und ich habe versucht näher zu kommen, aber könnte mir jemand helfen zu verstehen, wie ich das besser machen kann?

zeichenfolge:

6 - 11 PM, Palma Sola Elementary, 6806 Fifth Ave NW, Bradenton, FL 34209 Kommen Sie in der Nähe des dsfsd sa fsa fasdf asfsds 5001 in westlicher Richtung. Ihre Mama lebt nicht hier, mein 2005er Ford Ranger.

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}) (Gericht | ct | Straße | st | Laufwerk | 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 | HI | 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 | ODER | PA | RI | SC | SD | TN | TX | UT | VA | VI | VT | WA | WI | WV | WY) ([\ s | \, |.] +) (\ S +\d {5}) ([\ s | \, |.] +)/i

(Manchmal gibt es nur eine Straße und eine Stadt, aber keinen Bundesstaat oder eine Postleitzahl.)

regex 2: 

/\b (\ d {2,5}\s +) (?! [a | p] m\b) (NW | NE | SW | SE | Norden | Süden | Westen | Osten | n | e | s | w ) ([\ s | \, |.] +) (([a-zA-Z |\s +] {1,30}) {1,4}) (Gericht | ct | Straße | st | Laufwerk | dr | lane | ln | road | rd | blvd)/i

Geige damit: http://jsfiddle.net/isuelt/rMC6P/11/

18
isuelt

US-Adressen sind keine regulären Sprachen und können nicht mit regulären Ausdrücken abgeglichen werden. Sie sind in einigen Einzelfällen hilfreich, aber im Allgemeinen werden Sie versagen, insbesondere bei solchen Eingaben.

Ich habe in einer Adressverifizierungsfirma gearbeitet. Als Antwort auf Ihre Frage, um eine Adresse in einer Textzeichenfolge hervorzuheben, empfiehlt es sich, ein Extraktionsprogramm zu verwenden. Es gibt ein paar da draußen und ich schlage vor, Sie schauen sich um, aber hier istoursmit der Eingabe Ihrer Frage --- wie Sie sehen, hat sie die Adresse gefunden und bestätigt:

LiveAddress extraction example

Der API-Endpunkt gibt JSON zurück, das die Start- und Endpositionen jeder Adresse sowie viele Informationen zu jeder Adresse enthält. (Siehe die CSV-Ausgabe unten im Bild oben.)

Ich empfehle Ihnen, dass Sie den regulären Ausdrücken, die Sie versucht haben, trotzen! Hoffentlich ist das hilfreich.

32
Matt

Ich musste etwas Ähnliches für Adressen wie tun 

800 SE 20 AVENUE # 603, DEERFIELD BEACH

9801 NW 3 STREET APT 5, PLANTATION

11909 GLENMORE DRIVE # 4-1, CORAL SPRINGS

Dies ist die Regex, die ich verwendet habe

\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

Es gibt separate Gruppen für jeden Teil der Adresse zurück (ich musste den Statusnamen für meinen Fall nicht analysieren). Probieren Sie es hier aus. https://regex101.com/r/ OsvOxn/3

2
nimatra

Matt hat recht. Regex-Parsing wird nie sehr genau sein. Sie werden zwangsläufig eine angemessene Anzahl von falschen und negativen Ergebnissen haben, wenn Sie diesen gefährlichen Weg einschlagen. Wenn Sie damit einverstanden sind, benutze ich eigentlich gerne eine Kombination aus zwei Regexen - eine für Straßennamen und eine für Stadtnetze:

Straßennamen-System:

/\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

Netzsystem  

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

Beachten Sie auch, dass, wenn die Adresse keinen Bundesstaat und keine Postleitzahl hat, Sie grundsätzlich das Extrahieren von Text vergessen können, der nach dem Straßennamen geht. 

0
Scottmas