Encuentra una dirección de calle de los EE. UU. En texto (preferiblemente usando expresiones regulares de Python)

Descargo de responsabilidad: Leí con mucho cuidado este hilo: Búsqueda de dirección en una cadena: Python o Ruby y muchos otros recursos.

Nada me funciona hasta ahora.

En algunos detalles más aquí es lo que estoy buscando es:

Las reglas están relajadas y definitivamente no estoy pidiendo un código perfecto que cubra todos los casos; Solo unos simples y básicos con suposiciones de que la dirección debe estar en el formato:

a) Número de calle (1 … N dígitos);

b) Nombre de la calle: una o más palabras en mayúscula;

b-2) (opcional) sería mejor si pudiera tener el prefijo abbrev. “S.”, “N.”, “E.”, “W.”

c) (opcional) la unidad / apartamento / etc puede ser cualquier (incl. vacío) número de caracteres arbitrarios

d) Calle “tipo”: uno de (“st.”, “ave.”, “way”);

e) Nombre de la ciudad: 1 o más palabras en mayúscula;

f) (opcional) abreviatura del estado (2 letras)

g) (opcional) zip que es cualquier 5 dígitos.

Ninguno de los anteriores debe ser válido (por ejemplo, una ciudad o código postal existente).

Estoy intentando expresiones como estas hasta ahora:

pat = re.compile (r ‘\ d {1,4} (\ w +) {1,5}, (. *), (\ w +) {1,5}, (AZ | CA | CO | NH), [0-9] {5} (- [0-9] {4})? ‘, Re.IGNORECASE)

>>> pat.search("123 East Virginia avenue, unit 123, San Ramondo, CA, 94444") 

No trabajes, y para mí no es fácil entender por qué. Específicamente: cómo separo en mi patrón un grupo de palabras de una de las palabras específicas que deben seguir, como la abreviatura de estado. o calle “tipo (” st., ave.)?

De todos modos: aquí hay un ejemplo de lo que espero obtener: Dado def ex_addr (texto): # ¿devuelve el número magic # devuelve la primera dirección (todas las direcciones?) O Ninguna si no se encuentra nada

 for t in [ 'The meeting will be held at 22 West Westin st., South Carolina, 12345 on Nov.-18', 'The meeting will be held at 22 West Westin street, SC, 12345 on Nov.-18', 'Hi there,\n How about meeting tomorr. @10am-sh in Chadds @ 123 S. Vancouver ave. in Ottawa? \nThanks!!!', 'Hi there,\n How about meeting tomorr. @10am-sh in Chadds @ 123 S. Vancouver avenue in Ottawa? \nThanks!!!', 'This was written in 1999 in Montreal', "Cool cafe at 420 Funny Lane, Cupertino CA is way too cool", "We're at a party at 12321 Mammoth Lane, Lexington MA 77777; Come have a beer!" ] print ex_addr(t) 

Me gustaría conseguir:

 '22 West Westin st., South Carolina, 12345' '22 West Westin street, SC, 12345' '123 S. Vancouver ave. in Ottawa' '123 S. Vancouver avenue in Ottawa' None # for 'This was written in 1999 in Montreal', "420 Funny Lane, Cupertino CA", "12321 Mammoth Lane, Lexington MA 77777" 

¿Podrias ayudarme por favor?

 \d{1,4}( \w+){1,5}, (.*), ( \w+){1,5}, (AZ|CA|CO|NH), [0-9]{5}(-[0-9]{4})? 

En esta expresión regular, tiene uno demasiados espacios (antes ( \w+){1,5} , que ya comienza con uno). Eliminándolo, coincide con tu ejemplo.

No creo que pueda asumir que habrá una “unidad 123” o similar, o podría haber varias (por ejemplo, “edificio A, apt 3”). Tenga en cuenta que en su regex inicial, el . podría coincidir , que podría conducir a coincidencias muy largas (y no deseadas). Probablemente debería aceptar varios de estos grupos con una limitación en el número (por ejemplo , (.*) reemplazar , (.*) Con algo como (, [^,]{1,20}){0,5} .

En cualquier caso, es probable que nunca obtenga algo 100% preciso que acepte cualquier variación que la gente pueda ofrecerle. ¡Haz muchas pruebas! Buena suerte.

Acabo de encontrar esto en GitHub porque tengo un problema similar. Parece funcionar y ser más robusto que su solución actual.

https://github.com/madisonmay/CommonRegex

Mirando el código, la expresión regular para las cuentas de direcciones de calles para muchos más escenarios. ‘\ d {1,4} [\ w \ s] {1,20} (?: calle | st | avenue | ave | road | rd | highway | hwy | square | sq | trail | trl | drive | dr | corte | ct | parkway | pkwy | circle | cir | boulevard | blvd) \ W? (? = \ s | $) ‘