2010-12-28 2 views
2

Привет, Мне было интересно, как я могу найти Уличный адрес в строке в Python/Ruby?Поиск улиц в строке - Python или Ruby

Возможно, при помощи регулярного выражения?

Кроме того, это будет в следующем формате (США)

420 Fanboy Lane, Cupertino CA

Спасибо!

+10

Обязательно: http://xkcd.com/208/ –

+0

Вы бы разместить некоторые разумные ограничения на то, что «уличный адрес " является. Сколько у него цифр? Должен ли он иметь правильное окончание (например, Rd, St, Ct)? Сколько слов у него есть до окончания (например, 1337 Old Stack Overflow Questions Lane слишком долго?) –

+0

Ха-ха, смешно. Что бы я хотел сделать. – Souleiman

ответ

2

Используя ваш пример это то, что я придумал в Руби (я редактировал его, чтобы включить Почтовый индекс и необязательный +4 ZIP):

regex = Regexp.new(/^[0-9]* (.*), (.*) [a-zA-Z]{2} [0-9]{5}(-[0-9]{4})?$/) 
addresses = ["420 Fanboy Lane, Cupertino CA 12345"] 
addresses << "1829 William Tell Oveture, by Gioachino Rossini 88421" 
addresses << "114801 Western East Avenue Apt. B32, Funky Township CA 12345" 
addresses << "1 Infinite Loop, Cupertino CA 12345-1234" 
addresses << "420 time!" 

addresses.each do |address| 
    print address 
    if address.match(regex) 
    puts " is an address" 
    else 
    puts " is not an address" 
    end 
end 

# Outputs: 
> 420 Fanboy Lane, Cupertino CA 12345 is an address 
> 1829 William Tell Oveture, by Gioachino Rossini 88421 is not an address 
> 114801 Western East Avenue Apt. B32, Funky Township CA 12345 is an address 
> 1 Infinite Loop, Cupertino CA 12345-1234 is an address 
> 420 time! is not an address 
+0

Этот код не работает для меня ... Файл «mini.py», строка 1 regex = Regexp.new (/^[0-9] * (. *), (. *) [a-zA-Z] {2} $ /) ^ SyntaxError: недействительный синтаксис Но спасибо! – Souleiman

+0

Это потому, что это Ruby, а не Python. Извините, это было очевидно. –

+0

О да, я очень глуп. Сожалею! (Я был похож на то, что этот код, так странно) Off, чтобы установить Ruby. DreamHost поддерживает это, верно?) Python и ruby ​​похожи правильно? – Souleiman

0
\d{1,4}(\w+){1,3},(\w+){1,3} [A-Z]{2} 

Не полностью протестировано, но должно работать. Просто используйте его с вашей любимой функцией от re (например re.findall Предположения:.

  1. Номер дома может быть длиной от 1 до 4 цифр
  2. 1-3 слов следуют за номером дома, и все они разделены пробелами
  3. имя
  4. Город 1-3 слов (должно соответствовать Cupertino, Лос-Анджелес и Сан-Луис-Обиспо)
+0

+1 за хороший ответ, хотя я считаю, что мой лучше;). В основном потому, что он более гибкий. Конечно, это означает, что у меня могут быть и более ложные срабатывания. Я также пошел с нижним и верхним регистром, потому что я предположил, что ввод может быть введен неверно. –

+0

@Mike '\ w' соответствует всему, что похоже на слово, поэтому оно будет соответствовать заглавным словам и строчным. –

+0

Да, но вы можете совместить только до 3 слов. Это может быть проблемой и для меня, хотя, поскольку она по необходимости будет соответствовать больше. О, и я имел в виду нижнее/верхнее состояние. Извините за плохое общение. –

0

Хорошо, на основе очень полезные ответы Майк Bethany и Рейф Kettler (спасибо!) я получаю это REGEX работает питона и рубин. /[0-9] {1,4}, (.) [A-Za-Z] {2} [0-9] {5}/

Рубин Code (.) - Результаты в 12 Аргонавт Lane, Lexington MA 02478

myregex=Regexp.new(/[0-9]{1,4} (.*), (.*) [a-zA-Z]{2} [0-9]{5}(-[0-9]{4})?/) 

print "We're Having a pizza party at 12 Argonaut Lane, Lexington MA 02478 Come join the party!".match(myregex) 

Python код - не работает совсем то же самое, но это базовый код.

import re 
myregex = re.compile(r'/[0-9]{1,4} (.*), (.*) [a-zA-Z]{2} [0-9]{5}(-[0-9]{4})?/') 
search = myregex.findall("We're Having a pizza party at 12 Argonaut Lane, Lexington MA 02478 Come join the party!") 
+0

Tack on '(- [0-9] {4})?' В конце, и вы получите дополнительные +4 ZIP. –

+0

Аах! Так вот как вы делаете что-то необязательное - поставьте его в скобки и положите? после этого? Спасибо! – Souleiman

0

Как указано, адреса являются очень свободными. Вместо подхода REGEX, как насчет услуги, которая предоставляет точные, стандартизированные адресные данные? Я работаю для SmartyStreets, где мы предоставляем API, который делает именно это. Один простой запрос GET, и вы получили свой адрес для вас. Попробуйте питона образец из (вы должны начать trial):

https://github.com/smartystreets/smartystreets-python-sdk/blob/master/examples/us_street_single_address_example.py

+0

Это кажется прохладным сервисом; В то время регулярные выражения отлично работали для моего проекта. Я переписываю службу и используя некоторые новые знания, API Google Maps делает это и многое другое бесплатно.: P Однако колпачки являются недостатком. – Souleiman

+0

Хорошие новости, результаты теперь возвращаются в заголовке (не ВСЕ). Я скоро обновляю этот образец. – mdwhatcott

+0

Кстати, имейте в виду, что API Карт Google не может гарантировать, что данный адрес в настоящее время реальный и конечный - USPS является авторитетом здесь. – mdwhatcott

0

Вот что я использовал:

(\d{1,10}(\w+){1,10}((\w+){1,10})?(\w+){1,10}[,.]((\w+){1,10}(,)? [A-Z]{2}([0-9]{5})?)?) 

Это не совершенна и не соответствует крайние случаи, но это работает для большинства регулярно вводимых адресов и частичных адресов.

Он находит адреса в тексте, такие как

Hi! I'm at 12567 Some St. Fairfax, VA. Come get me!

some text 12567 Some St. is my home

something else 123 My Street Drive, Fairfax VA 22033

Надеется, что это помогает кому-то

4

Может быть, вы хотите взглянуть на pypostal. pypostal - это официальные привязки Python к libpostal.

С примерами из Майк Вифании я сделал этот небольшой пример:

from postal.parser import parse_address 

addresses = [ 
    "420 Fanboy Lane, Cupertino CA 12345", 
    "1829 William Tell Oveture, by Gioachino Rossini 88421", 
    "114801 Western East Avenue Apt. B32, Funky Township CA 12345", 
    "1 Infinite Loop, Cupertino CA 12345-1234", 
    "420 time!", 
] 

for address in addresses: 
    print parse_address(address) 
    print "*" * 60 

>  [(u'420', u'house_number'), (u'fanboy lane', u'road'), (u'cupertino', u'city'), (u'ca', u'state'), (u'12345', u'postcode')] 
>  ************************************************************ 
>  [(u'1829', u'house_number'), (u'william tell', u'road'), (u'oveture by gioachino', u'house'), (u'rossini', u'road'), (u'88421', 
> u'postcode')] 
>  ************************************************************ 
>  [(u'114801', u'house_number'), (u'western east avenue apt.', u'road'), (u'b32', u'postcode'), (u'funky', u'road'), (u'township', 
> u'city'), (u'ca', u'state'), (u'12345', u'postcode')] 
>  ************************************************************ 
>  [(u'1', u'house_number'), (u'infinite loop', u'road'), (u'cupertino', u'city'), (u'ca', u'state'), (u'12345-1234', 
> u'postcode')] 
>  ************************************************************ 
>  [(u'420', u'house_number'), (u'time !', u'house')] 
>  ************************************************************ 

 Смежные вопросы

  • Нет связанных вопросов^_^