街道地址搜索字符串 - Python或Ruby

时间:2010-12-28 00:49:17

标签: python ruby regex street-address

嘿 我想知道如何在Python / Ruby的字符串中找到街道地址?

也许是正则表达式?

此外,它将采用以下格式(美国)

420 Fanboy Lane,Cupertino CA

谢谢!

6 个答案:

答案 0 :(得分:4)

也许你想看看pypostal。 pypostal是libpostal的官方Python绑定。

以Mike Bethany的例子为例,我做了一个小例子:

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')]
>     ************************************************************

答案 1 :(得分:2)

使用您的示例这是我在Ruby中提出的(我编辑它包含邮政编码和可选的+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  

答案 2 :(得分:0)

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

尚未经过全面测试,但应该可以使用。只需将其与re中您最喜欢的功能一起使用(例如re.findall。假设:

  1. 门牌号码长度可以在1到4位之间
  2. 1-3个单词跟随门牌号,并且它们全部用空格分隔
  3. 城市名称是1-3个字(需要与库比蒂诺,洛杉矶和圣路易斯奥比斯波相匹配)

答案 3 :(得分:0)

好的,基于非常有帮助的Mike Bethany和Rafe Kettler的回复(谢谢!) 我得到这个REGEX适用于python和ruby。 / [0-9] {1,4}(。),(。)[a-zA-Z] {2} [0-9] {5} /

Ruby代码 - 12 Argonaut 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!")

答案 4 :(得分:0)

如上所述,地址非常自由。而不是REGEX方法如何提供准确,标准化的地址数据的服务?我为SmartyStreets工作,在那里我们提供了一个可以做到这一点的API。一个简单的GET请求,你已经解析了你的地址。试试这个python样本(你需要开始trial):

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

答案 5 :(得分:0)

以下是我使用的内容:

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

它并不完美且与边缘情况不匹配,但它适用于大多数常规类型的地址和部分地址。

它在文本中找到地址,例如

  

嗨!我在弗吉尼亚州圣费尔法克斯市的12567号。快来找我!

     

一些文字12567 Some St.是我的家

     

别的东西123 My Street Drive,Fairfax VA 22033

希望这有助于某人